我找不到一个很好的例子,可能是我错了:
我有一堆通过表达式语法连接的表,如果有值,我想留下外连接两个,否则返回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个表。
或者我做错了什么?
答案 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
}
}