如何从嵌入式LINQ c#访问表

时间:2016-07-21 07:43:34

标签: c# linq where

请注意以下完全由例如清酒组成。我有一个基于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

有解决方法吗?我已经尝试了很多其他的但是没有给我一个正确的。

1 个答案:

答案 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)