c# - 实体框架和菱形连接
问题描述
有没有办法使用不涉及交叉连接的实体框架执行“钻石连接”?在 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;
(我假设内部联接将与此演示代码中的这些左外部联接发挥相同的作用;我没有检查,因为我正在处理的查询使用左联接。)
解决方案
尝试以下:
(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();
推荐阅读
- android - Dagger-Hilt:为什么我们必须注释没有注入的活动
- javascript - 如何使时钟指针移动/旋转(html,css)
- c++ - 错误:需要左值作为一元“&”操作数 - Qt 中的信号连接
- java - 有没有办法使用 Jackson 和/或其相关库之一(csv、json 等)将字符串转换为 Java 类型?
- javascript - 在 javascript 中创建队列的最佳方法是什么?
- javascript - 使用 React Router 只显示一个组件
- node.js - firebase 初始化错误。(节点:82729)UnhandledPromiseRejectionWarning
- google-apps-script - 如果不为空或为空,Google 表单添加 createChoice
- google-sheets - 零值显示不一致
- python - Matplotlib中聚类柱形图的绘制