Linq с объединением на 3 таблицы

#linq #union

#linq #объединение

Вопрос:

Мне нравится использовать linq для объединения 3 таблиц. Не уверен, почему что-то вроде следующего не будет работать:

 var repdata = (from p in db.Table1
               select p)
                       .Union(from p in Table2
                        select p);
  

Ответ №1:

Union работает только с одним и тем же типом элемента. Вы могли бы использовать:

 var data = db.Table1.Select(p => new { p.Value1, p.Value2 })
     .Union(db.Table2.Select(q => new { q.Value1, q.Value2 })
     .Union(db.Table3.Select(r => new { Value1 = r.Alias1, Value2 = r.Other }); 
  

Здесь анонимный тип служит общим типом для проецирования всех трех таблиц, чтобы Union он мог работать.

Комментарии:

1. Джон, я получаю сообщение об ошибке, когда это происходит таким образом. Это означает, что программа даже не будет запущена. Что представляют значение1, Значение2 и т. Д.?

2. @NatePet: любые свойства, к которым вы пытаетесь получить доступ из таблиц. Вы ничего не рассказали нам о таблицах, поэтому я придумал несколько имен и показал, как использовать проекции, если имена не совпадают во всех трех таблицах.

3. Я попытался сопоставить таблицы в моей таблице, но не сработал, как ожидалось: var data = db.TerritoryReps.Select(p => new { p.Rpfn, p.Rpln }) .Union(db.RegionalManagers.Select(q => new { q.Rfn, q.Rln }) .Union(db.DistrictManagers.Select(r => new { r.Dfn, r.Dln });

4. @Nate Pet: Джон уже показал вам, как решить эту проблему. Пожалуйста, прочитайте его ответ и его комментарий еще раз!

5. @NatePet: у этих анонимных типов разные имена свойств, не так ли? Вы должны использовать один и тот же анонимный тип для всех трех таблиц, что означает использование одинаковых имен свойств и типов в том же порядке.