Entity Framework - Левое внешнее соединение для нескольких столбцов с условием ИЛИ - PullRequest
2 голосов
/ 25 марта 2020

Можно ли написать лямбда-соединение слева для нескольких столбцов, которые будут генерировать условие ИЛИ вместо AND?

var query = context.table1.GroupJoin(
    context.table2,
    x => new { JoinCol1 = x.CustomerCode, JoinCol2 = x.CustomerName},
    y => new { JoinCol1 = y.Code, JoinCol2 = y.Name},
    (x, y) => new { 
        firstTable = x,
        secondTable = y
    }).SelectMany(
       x => x.OrganizationAddress.DefaultIfEmpty(),
       (x, y) => {
          x.firstTable.field1,
          x.firstTable.field2,
          y.Field3,
          y.Field4
       }
    )

Это сгенерирует следующий запрос

    SELECT t1.filed1, t1.field2, t2.field3, t2.field4 
    FROM table1
    LEFT JOIN table2 ON table1.CustomerCode = table2.Code 
                     AND table1.CustomerName = table2.Name 

Я бы хотел получить тот же запрос, но вместо условия AND я хочу, чтобы он был ИЛИ:

    SELECT t1.filed1, t1.field2, t2.field3, t2.field4 
    FROM table1
    LEFT JOIN table2 ON table1.CustomerCode = table2.Code 
                     OR table1.CustomerName = table2.Name 

Есть ли способ достичь этого?

РЕДАКТИРОВАТЬ: версия - EF 6.2.0

1 Ответ

1 голос
/ 25 марта 2020

Операторы соединения LINQ (Join, GroupJoin) поддерживают только равные соединения. Все другие типы соединений должны быть реализованы как коррелированные подзапросы.

Для рассматриваемого объединения вы просто используете альтернативный шаблон LINQ left external join - коррелированный SelectMany с DefaultIfEmpty(). Как то так:

var query = context.table1.SelectMany(
    t1 => context.table2
        .Where(t2 => t1.CustomerCode == t2.Code || t1.CustomerName == t2.Name)
        .DefaultIfEmpty(),
    (t1, t2) => new
    { 
        t1.field1,
        t1.field2,
        t2.Field3,
        t3.Field4
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...