#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: у этих анонимных типов разные имена свойств, не так ли? Вы должны использовать один и тот же анонимный тип для всех трех таблиц, что означает использование одинаковых имен свойств и типов в том же порядке.