实体框架以空条件连接

时间:2016-08-19 16:36:37

标签: sql entity-framework join

我有一个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

1 个答案:

答案 0 :(得分:4)

将条件移动到LikeMail.php子句(对于内连接,它确实无关紧要):

where

或使用以下

join t3 in ctx.T3 on t2.pk2 equals t3.fk2
where t3.x == null