我有一个SQL查询,我试图转换为实体框架表达式。其中一个join子句有一个null测试,我不确定如何在EF中表达它。这是SQL查询,请注意,连接实际上有多个条件:
SELECT T1.*
FROM product T1
INNER JOIN T2 ON T1.pk1 = T2.fk1
INNER JOIN T3 ON T2.pk2 = T3.fk2 AND T3.x IS NULL <-- this is the issue
出于对简单事物的盲目希望,我尝试了这个EF表达式:
from t1 in ctx.T1
join t2 in ctx.T2 on t1.pk1 equals t2.fk1
join t3 in ctx.T3 on t2.pk2 equals t3.fk2 && t3.x == null
select t1
编译器不喜欢&& t3.x == null
部分。它说
错误CS0019操作员&amp;&amp;&amp;&#39;不能应用于&#39; int&#39;类型的操作数和&#39; bool&#39;
所以我尝试了这个(注意T3.x是一个可以为空的日期字段):
from t1 in ctx.T1
join t2 in ctx.T2 on t1.pk1 equals t2.fk1
join t3 in ctx.T3 on new { A = t2.pk2, B = null as DateTime? } equals new { A = t3.fk2 && B = t3.x }
select t1
编译,但当我运行它时,我得到
无法创建类型为&#39; System.Object&#39;的null常量值。在此上下文中仅支持实体类型,枚举类型或基元类型。
那我怎么能这样呢?
更新:正如Ivan Stoev所指出的,问题在于我使用null as DateTime?
而不是(DateTime?)null
。所以工作查询如下所示:
from t1 in ctx.T1
join t2 in ctx.T2 on t1.pk1 equals t2.fk1
join t3 in ctx.T3 on new { A = t2.pk2, B = (DateTime?)null } equals new { A = t3.fk2 && B = t3.x }
select t1
答案 0 :(得分:4)
将条件移动到LikeMail.php
子句(对于内连接,它确实无关紧要):
where
或使用以下
join t3 in ctx.T3 on t2.pk2 equals t3.fk2
where t3.x == null