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

C# 如何从嵌入式LINQ c访问表#,c#,linq,where,C#,Linq,Where,请注意,下面的内容完全是虚构的。我有一个基于sql代码的类似查询,但无法将其转换为LINQ以获得正确的值 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 sql基本上如下所示: se

请注意,下面的内容完全是虚构的。我有一个基于sql代码的类似查询,但无法将其转换为LINQ以获得正确的值

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
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. 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只支持Equijoin。任何附加标准应转到
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)