Выбрать все столбцы после JOIN в LINQ - PullRequest
10 голосов
/ 22 октября 2011

У меня есть две таблицы, Table1 и Table2. Я хочу выполнить, скажем, левое внешнее соединение:

var myOutput = from object1 in Table1
               join object2 in Table2
               on object1.Property1 equals object2.Property2 into Table3
               from output in Table3.DefaultIfEmpty()
               select new
                   {
                       object1.Property1,
                       object1.Property2,
                       //...
                       output.Property3,
                       output.Property4,
                       //...
                   };

Как вы можете заметить, я хочу выбрать все свойства обоих объектов из результирующей таблицы (перечислимые числа, рассматриваемые при объединении, содержат объекты определенных типов - они различны для обоих отношений). Конечно, я могу выбрать свойства в анонимном select, как показано в примере.

Мой вопрос: как не указывать все свойства вручную? Я хотел бы иметь что-то вроде SELECT * FROM TABLE3, где TABLE3 является результирующим отношением (после объединения TABLE1 и TABLE2).

Заранее спасибо за подсказки.

1 Ответ

10 голосов
/ 22 октября 2011

Вы должны указать каждый вручную, если вы хотите проецировать в плоский тип.Другой вариант состоит в том, чтобы комбинированный тип содержал оба объекта, и объекты будут естественным образом приобретать свои свойства.

select new 
{
    Object1 = object1,
    Object2 = output
};

И вы будете работать с ним, как myObj.Object1.Property1, myObj.Object2.Property4 и т. Д.

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

select new CombinedType(object1, output);
//or 
select builder.GetCombinedType(object1, output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...