Мне удалось получить LEFT OUTER JOIN
для пары составного внешнего ключа barcode, event_id
, работающей как в Linq2Sql, так и в Entity Framework, преобразовав в лямбда-синтаксис в соответствии с этим примером синтаксиса запроса .
Это работает путем создания анонимной проекции, которая используется в соответствии левой и правой сторонам условия соединения:
var dnrs = context.participants.GroupJoin(
context.prereg_participants,
x => new { JoinCol1 = x.barcode, JoinCol2 = x.event_id }, // Left table join key
y => new { JoinCol1 = y.barcode, JoinCol2 = y.event_id }, // Right table join key
...
Примечания
ЭтоПодход основан на автоматическом равенстве , присваиваемом идентичным анонимным классам, а именно:
Поскольку методы Equals и GetHashCode для анонимных типов определены в терминах методов Equals и GetHashCode длясвойства, два экземпляра одного и того же анонимного типа равны, только если все их свойства равны.
Таким образом, для двух проекций ключи объединения должны быть одного типа, чтобы быть equal
компилятор должен видеть их как один и тот же анонимный класс за кулисами, то есть:
- Количество соединенных столбцов должно быть одинаковымв обеих анонимных проекциях
- Типы полей должны быть совместимы одного типа
- Если имена полей различаются, вам нужно их псевдоним (я использовал
JoinColx
)
Я поместил пример приложения на GitHub здесь .
К сожалению, пока нет поддержки кортежей значений в деревьях выражений ,поэтому вам нужно придерживаться анонимных типов в проекциях.