Linq to Entity Framework:多个左外连接创建完整外部

时间:2015-01-16 13:28:06

标签: c# entity-framework join

我找不到一个很好的例子,可能是我错了:

我有一堆通过表达式语法连接的表,如果有值,我想留下外连接两个,否则返回NULL。

所以sql看起来像这样:

select              *
from                table1 mr
left outer join     table2 on table1
left outer join     table3 on table2
left outer join     table4 on table3
where               mr.id = 1234

所以左连接对于这样的语法没有问题:

join oiA in query1 on organisation.Id equals oiA.Organisationid into qOrgInhA
from oiA in qOrgInhA.DefaultIfEmpty()

但是,只要我根据oiA添加其他表,实体框架就会生成交叉连接,而不是第二个左外连接。

根据我的阅读,GroupJoin可能是解决方案,但我找不到一个好的例子,我找到的大多数例子只有2个表。

或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

在方法语法中,可以像这样完成多个左连接:

var result = table1
.GroupJoin(table2, o => o.Key, i => i.FKey, (t1, t2) => new 
{ 
    t1, 
    t2.GroupJoin(table3, o => o.Key, i => i.FKey, (_t2, t3) => new 
    {
        _t2,
        t3
    })
});

实体框架生成的查询类似于:

select * from table1
left outer join table2 on table1.Key = table2.FKey
left outer join table3 on table2.Key = table3.FKey

修改 我对查询语法有点不稳定,但它在select中进行第二次连接的想法相同:

 var result = from t1 in table1
 join t2 in table2 on t1.Key equals t2.FKey into joinresult
 select new
 {
     t1,
     from jr in joinresult
     join t3 in table3 on jr.Key eq t3.FKey into joinresult2
     select new
     {
         jr,
         joinresult2
     }
 }