请注意以下完全由例如清酒组成。我有一个基于sql代码的类似查询,但无法将其转换为LINQ以获得正确的值。
sql基本上是这样的:
select * from customers c
join proucts p on c.id = p.customerid
join credit r on r.customerid=c.id and ISNULL(r.trandate, c.registeredDate) >= c.registeredDate
我也尝试调整上面的sql并将条件放在where里面,它也返回我在下面的#2 LINQ中获得的相同值(这是不正确的)。
我如何在里面使用c(客户)。信用额度是多少?见代码
from c in customers
join p in products on c.id = p.customerid
join cr in credit.Where(r=> r.tranDate => c.registeredDate!=null?c.registeredDate : r.purchaseDate) on c.id=cr.customerid
...
我知道你会建议为什么不把它放在下面的地方,如下所示,但我的价值不正确。
from c in customers
join p in products on c.id = p.customerid
join cr in credit on c.id=cr.customerid
where r.tranDate => c.registeredDate!=null?c.registeredDate : r.purchaseDate
有解决方法吗?我已经尝试了很多其他的但是没有给我一个正确的。
答案 0 :(得分:1)
LINQ仅支持equijoins。任何其他标准都应该转到where
子句。是的,其他范围变量无法从join
内部序列中访问,因此过滤应在join
之前或之后进行。
所以这个SQL查询:
select * from customers c
join products p on c.id = p.customerid
join credit r on r.customerid = c.id
and ISNULL(r.trandate, c.registeredDate) >= c.registeredDate
直接转换为此LINQ查询:
from c in customers
join p in products on c.id equals p.customerid
join cr in credit on c.id equals cr.customerid
where (cr.tranDate ?? c.registeredDate) >= c.registeredDate
select new { c, p, cr };
可选,条件
(cr.tranDate ?? c.registeredDate) >= c.registeredDate
可以替换为
(cr.tranDate == null || cr.tranDate >= c.registeredDate)