Linq to Entity Framework:多个左外连接创建完整外连接
Linq to Entity Framework: Multiple left outer joins create full outer
找不到很好的例子,可能是我找错了:
我有一堆通过表达式语法连接的表,如果有值,我想再左外连接两个,否则 return 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 添加其他表,Entity Framework 就会生成一个交叉联接,而不是第二个左外部联接。
根据我的阅读,GroupJoin 可能是解决方案,但我真的找不到很好的例子,我找到的大多数例子只有 2 个表。
还是我做错了什么?
在方法语法中,多个左连接可以这样完成:
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
})
});
entity framework 生成的结果查询将类似于:
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
}
}
找不到很好的例子,可能是我找错了:
我有一堆通过表达式语法连接的表,如果有值,我想再左外连接两个,否则 return 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 添加其他表,Entity Framework 就会生成一个交叉联接,而不是第二个左外部联接。
根据我的阅读,GroupJoin 可能是解决方案,但我真的找不到很好的例子,我找到的大多数例子只有 2 个表。
还是我做错了什么?
在方法语法中,多个左连接可以这样完成:
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
})
});
entity framework 生成的结果查询将类似于:
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
}
}