【问题标题】:Entity Framework join with null condition实体框架加入空条件
【发布时间】:2016-08-19 16:36:36
【问题描述】:

我有一个 SQL 查询,我正在尝试将其转换为实体框架表达式。其中一个连接子句对 null 进行了测试,我不确定如何在 EF 中表达它。这是SQL查询,注意join实际上有多个条件:

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

编译器不喜欢&amp;&amp; t3.x == null 部分。它说

错误 CS0019 运算符“&&”不能应用于“int”和“bool”类型的操作数

所以我尝试了这个(注意 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

编译,但是当我运行它时,我得到了

无法创建“System.Object”类型的空常量值。此上下文仅支持实体类型、枚举类型或原始类型。

那我该怎么办呢?

更新:正如 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

【问题讨论】:

    标签: sql entity-framework join


    【解决方案1】:

    要么将条件移动到where 子句(对于内部连接,它真的没关系):

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

    或使用以下

    join t3 in ctx.T3
        on new { A = t2.pk2, B = (DateTime?)null }
        equals new { A = t3.fk2, B = t3.x }
    

    【讨论】:

    • 谢谢,看来我不得不使用on new { A = t2.pk2, B = (DateTime?)null } 而不是on new { A = t2.pk2, B = null as DateTime? }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多