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



请注意,下面完全是为了举例。我有一个基于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)

相关内容

  • 没有找到相关文章

最新更新