[英]SQL limitation equivalent in linq
我正在寻找SQL查询以下的linq。
select * from tableA as A
left join tableB as B on A.Id = B.Id
left join tableC as C on B.Id = C.Id
left join tableD as D on C.Id = D.Id and D.OrderId = B.OrderId
我最感兴趣的是如何使用此表达式正确限制结果:
and D.OrderId = B.OrderId
C#代码
var data = from a in tableA
join innerB in tableB on a.Id equals innerB.Id into INNERB
from b in INNERB.DefaultIfEmpty()
join innerC in tableC on b.Id equals innerC.Id into INNERC
from c in INNERC.DefaultIfEmpty()
join innerD in tableD on c.Id equals innerD.Id into INNERD
from d in INNERD.DefaultIfEmpty().Where(p=>p.OrderId == b.OrderId)
linq从数据库返回的结果与SQL查询不匹配。 如果您能向我解释如何使用来自应用于每行的上一个联接表中的变量,则可以得到任何提示。
我也尝试过,但是编译器抛出错误“ b的名称在当前上下文中不存在”:
join innerD in tableD.Where(p=>p.OrderId == b.OrderId) on c.Id equals innerD.Id into INNERD
from d in INNERD.DefaultIfEmpty()
请参阅以下答案以获取更简单的LEFT JOIN
语法: https : //stackoverflow.com/a/4739738/1869660
您的查询将是:
var data = from a in tableA
from b in tableB.Where(x => x.Id == a.Id)
.DefaultIfEmpty()
from c in tableC.Where(x => x.Id == b.Id)
.DefaultIfEmpty()
from d in tableC.Where(x => (x.Id == c.Id) && (x.OrderId == b.OrderId))
.DefaultIfEmpty()
select ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.