【问题标题】:Where using "IS NULL"在哪里使用“IS NULL”
【发布时间】: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


【解决方案1】:

试试这个可能对你有帮助...

dbset.Where(e=> (e.MyNullableInt ?? -1) == -1).ToList();

【讨论】:

  • 它部分有效。如果您运行 dbset.Where(e=> (e.MyNullableInt ?? -1) == -1)... 它什么也不会检索到。如果您运行 dbset.Where(e=> (e.MyNullableInt ?? -1) != -1)... 它将检索那些不等于 -1 的行。在 SQL 术语中,代码是这样的: WHERE (-1 = NullableInt) 和... WHERE (-1 NullableInt) 感谢您的帮助。
  • 在 SQL 术语中类似于 ISNULL(NullableInt,-1) = -1。我正在使用它来检索我的应用程序的数据,它对我有用。
  • 也许您使用的是不同版本的 EF。在我的 API 中,生成的 SQL 非常不同,如下所示“WHERE (-1 = [Extent1].[NullableInt])”
【解决方案2】:

检查您的映射,因为我在映射时看到了这种情况,您以某种方式将该字段设为必填。

或在您的数据库中,该字段不可为空。

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多