首页 > 解决方案 > 实体框架和菱形连接

问题描述

有没有办法使用不涉及交叉连接的实体框架执行“钻石连接”?在 SQL 本身中,我可以这样说:

SELECT d.*
FROM a
    LEFT JOIN b ON a.x = b.x
    LEFT JOIN c ON a.y = c.y
    LEFT JOIN d ON b.z = d.z OR c.z = d.z
WHERE a.w = 42;

这避免了与 的交叉连接d

对于 Entity Framework,以下 LINQ 语法是等效的,但执行交叉连接d

from a in TableA
join b in TableB on a.x equals b.x into bGroup
from b in bGroup.DefaultIfEmpty()
join c in TableC on a.y equals c.y into cGroup
from c in cGroup.DefaultIfEmpty()
from d in TableD
where d.z == b.z || d.z == c.z
where a.w == 42
select d;

(我假设内部联接将与此演示代码中的这些左外部联接发挥相同的作用;我没有检查,因为我正在处理的查询使用左联接。)

标签: c#entity-frameworklinqjoin

解决方案


尝试以下:

(from a in TableA
join b in TableB on a.x equals b.x into bGroup
from b in bGroup.DefaultIfEmpty()
join c in TableC on a.y equals c.y into cGroup
from c in cGroup.DefaultIfEmpty()
select new { a = a, b = b, c = c}
).SelectMany(x => TableD.Where(y => (x.a.w == 42) && ((x.b.z == y.z) || (x.c.z == y.z))).Select(y => y))
.ToList();  

推荐阅读