【发布时间】:2015-07-04 21:27:54
【问题描述】:
我正在尝试使用 EF 4.3.1 检索一组记录。我需要获取所有在某些列中具有 NULL 值的记录。
我检查了数据库,该列中有许多行为空,该列也可以为空。 EF 正在做一些奇怪的事情。查看分析器,它正在生成以下 SQL:
SELECT
CAST(NULL AS int) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0
我的实体列被声明为“int?”
我尝试使用以下组合,但得到相同的结果:
dbset.Where(e=>e.MyNullableInt == null).ToList();
dbset.Where(e=>e.MyNullableInt.Equals(null)).ToList();
我可以通过这种奇怪行为的唯一方法是加载完整集,填充变量并在此步骤之后执行 where,这是非常无效的,因为它加载了所有数据。
任何想法如何实现这一目标?
【问题讨论】:
-
更新:我在 Codeplex 中找到了以下票证,涉及检测到的影响 EF 5 之前的 EF 版本的问题。entityframework.codeplex.com/workitem/178 他们建议使用比较来解决该问题,但在我的情况下,我这样做了不使用变量,我需要使用 null 进行实际过滤。有谁知道如何解决这个问题?
-
您确定已将映射定义为可为空的吗?实体的字段上是否有 [Required] 属性?
-
是的,实际上该列是一个外键。实体的配置是使用 fluent API 进行的。我已经检查过了,数据库在此列中有很多行具有空值。如果您从 EF 获得整个集合,它会为那些在该列上没有值的行返回 null,而对于那些有的行则返回 id。当您使用 (x=>x.id == null) 条件时会出现问题。现在不能迁移到最新版本的 EF,因为这需要我在整个应用程序中进行多次测试。
标签: entity-framework entity-framework-4 entity-framework-4.1