LINQ для SQL с несколькими ЛЕВЫМИ ВНЕШНИМИ СОЕДИНЕНИЯМИ в разных таблицах

Я пытаюсь создать запрос LINQ, содержащий внешние соединения LEFT. Есть определенные примеры, но у меня немного другой сценарий

Select * from A_TABLE
LEFT OUTER JOIN B_TABLE ON A_TABLE.Id = B_TABLE.A_TABLE_Id
LEFT OUTER JOIN C_TABLE ON B_TABLE.Id = C_TABLE.B_TABLE_Id

Второе соединение находится не в A_TABLE, а в B_TABLE и C_TABLE.

мы можем преобразовать его в LINQ?


person D J    schedule 16.09.2019    source источник


Ответы (1)


Вы можете просто преобразовать свой запрос в запрос linq следующим образом:

var results = (from a in A_TABLE
               join b in B_TABLE
               on a.A_TABLE_Id equals b.A_TABLE_Id into ab
               from b in ab.DefaultIfEmpty()
               join c in C_TABLE_List on b.B_TABLE_Id equals c.B_TABLE_Id

               select new
                   {
                     ClassAProperty1 = a.Property1,
                     ClassBProperty1 = b.Property1,
                     ClassCProperty1 = c.Property1
                   }).ToList();

вы можете продолжать присоединяться к столам в любое время.

Не забудьте изменить Property# на нужные имена свойств.

для получения дополнительной информации см. LINQ Left Outer Join, и этот поток стека.

Обновление: это версия запроса с лямбда-выражениями:

var result = A_TABLE
             .GroupJoin(B_TABLE,
                 a => a.A_TABLE_Id,
                 b => b.A_TABLE_Id,
                 (a, b) =>
                 new {
                       tableAProperty1 = a.Property1,
                       tableAProperty2 = a.Property2, /* You cannot access this property in next join if you don't add it here */
                       B_TABLE = b.FirstOrDefault() /* This is the way to access B_TABLE in next join */
                 }).GroupJoin(C_TABLE,
                       ab => ab.B_TABLE.B_TABLE_Id,
                       c => c.B_TABLE_Id,
                       (ab, c) =>
                       new {
                             ab.tableAProperty1,
                             B_TABLEProperty2 = ab.B_TABLE.Property2,
                             C_TABLE = c.FirstOrDefault()
                            }).ToList();
person Community    schedule 16.09.2019
comment
большое спасибо .. могу я получить лямбда-выражение, пожалуйста? - person D J; 16.09.2019
comment
bb =› bb.b.Id не компилируется. bb.b — перечислимая коллекция. - person D J; 16.09.2019
comment
Извините, что увидел этот вопрос слишком поздно. Я отредактировал оба фрагмента кода. - person ; 17.09.2019