如何在实体框架中查询空值?

.net ado.net entity-framework

我想执行这样的查询

   var result = from entry in table
                     where entry.something == null
                     select entry;

并获得一个IS NULL生成。

编辑:在前两个答案后,我觉得有必要澄清我正在使用实体框架而不是Linq to SQL。 object.Equals()方法似乎不适用于EF。

编辑2:上述查询按预期工作。它正确生成IS NULL 。然而,我的生产代码是

value = null;
var result = from entry in table
                         where entry.something == value
                         select entry;

并且生成的SQL是something = @p; @p = NULL 。似乎EF正确地转换了常量表达式,但是如果涉及变量,它就像正常比较一样处理它。实际上是有道理的。我会结束这个问题

一般承认的答案

Linq-to-SQL的解决方法:

var result = from entry in table
             where entry.something.Equals(value)
             select entry;

Linq-to-Entities的解决方法(哎哟!):

var result = from entry in table
             where (value == null ? entry.something == null : entry.something == value)
             select entry;

这是一个令人讨厌的虫子,几次咬我。 如果此错误也影响了您,请访问UserVoice上错误报告,并让Microsoft知道此错误也会影响您。


编辑: 此错误正在EF 4.5中修复 !感谢大家提出这个错误!

为了向后兼容,它将选择加入 - 您需要手动启用设置以使entry == value起作用。还没有关于这个设置是什么的消息。敬请关注!


编辑2:根据EF团队的这篇文章这个问题已经在EF6中得到修复!哇噢!

我们更改了EF6的默认行为以补偿三值逻辑。

这意味着依赖于旧行为的现有代码null != null ,但仅在与变量进行比较时)将需要更改为不依赖于该行为,或将UseCSharpNullComparisonBehavior设置为false以使用旧的损坏行为。


热门答案

从Entity Framework 5.0开始,您可以使用以下代码来解决您的问题:

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

这应该可以解决您的问题,因为实体Framerwork将使用'C#like'null比较。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因