实体框架-具有OR条件的多列上的左外部联接

时间:2020-03-25 08:45:56

标签: c# sql entity-framework

是否可以在将生成OR条件而不是AND的多列上编写lambda左连接?

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 

我想获得相同的查询,但我希望它不是OR条件,而是OR:

    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 个答案:

答案 0 :(得分:1)

LINQ联接运算符(JoinGroupJoin)仅支持等联接。所有其他联接类型都必须实现为相关子查询。

对于有问题的连接,您只需使用替代的LINQ 左外部连接模式-将SelectManyDefaultIfEmpty()相关联。像这样:

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
    });