2010-10-07 2 views
0

У меня есть два запроса linq, которые я запускаю на двух разных таблицах: автомобиль и грузовик. Из этих запросов я выбираю ID, Name и Company.C# Добавление запросов Linq того же типа

var car = from c in db.Cars 
      select new {ID = c.ID, Name = c.Name, Company = c.Company}; 

var truck = from t in db.Trucks 
      select new {ID = t.ID, Name = t.Name, Company = t.Company}; 

Как добавить данные грузовик данные автомобиля с помощью Linq, так что результирующий запрос содержит как легковые и грузовые автомобили данных?

ответ

4

Если результирующие типы эквивалентны, вы можете использовать Enumerable.Concat для их комбинирования.

Однако я обычно не рекомендовал бы делать это с анонимными типами - вместо этого я бы рекомендовал создать собственный класс для хранения трех (или более) свойств. Возможно, с учетом приведенного выше кода, что тип может быть одним и тем же посткомпиляцией, но невозможно точно сказать, без дополнительной информации.

Лично я бы либо использовать общий интерфейс (то есть: есть Car и Truck реализовать ICompanyInfo с этими свойствами в интерфейсе), и вернуть автомобиль бросание в интерфейс, или сделать пользовательский класс, и вернуться, что от обоих запросов, затем используйте Concat для их объединения.

+0

До тех пор, пока анонимный тип имеет одинаковое количество свойств с тем же именем и типом в том же порядке, тогда они могут использовать 'Concat' on. Компилятор предупредит вас, если типы свойств не совпадают. – Enigmativity

+0

@ Энигматичность: Да - поэтому я сказал, что, скорее всего, это сработает. Однако, наличие нескольких условий, подобных этому, приводит к хрупкому программному обеспечению, которое не так хорошо подходит для долгосрочного обслуживания. Я бы не рекомендовал анонимные типы для чего-то вроде этого - это, очевидно, важная концепция в программном обеспечении OP. –

+0

Это не отличный дизайн, на данный момент я просто пытаюсь создать мертвый мозг простым способом заполнить выпадающий список в этой временной форме. В будущем автомобиль и грузовик реализуют интерфейс IVehicle. Я не знаю, как лучше всего настроить интерфейс на datatables в запросе linq, но я перейду через этот мост, когда я доберусь до него. – Shawn

0

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

var vehicles = from c in db.Cars   
    select new {ID = c.ID, Name = c.Name, Company = c.Company}; 
vehicles.Union(from t in db.Trucks   
    select new {ID = t.ID, Name = t.Name, Company = t.Company}; 

предполагая, что идентификатор, название и типы компаний одинаковы как в легковых и грузовых автомобилей.

+0

Union предполагает, что OP не хочет дубликатов, что, вероятно, является безопасным допущением в этом случае – cordialgerm

Смежные вопросы