请注意,下面完全是为了举例。我有一个基于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(客户)。信用在哪里?参见代码
1
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
...
2
我知道你会建议为什么不把它放在下面这样的地方,但我得到了不正确的值。
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
有变通办法吗?我试过很多其他的方法,但都没找到正确的。
LINQ仅支持等联接。任何附加条件都应转到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)