【发布时间】: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
编译器不喜欢&& 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