为什么EF在比较null变量时不会返回任何结果?

时间:2012-03-14 20:03:39

标签: c# linq entity-framework entity-framework-4 linq-to-entities

我在实体框架中的数据上下文中选择数据时遇到问题,我将其缩小到查询空值。我有这样的方法:

public void DoStuff(int? someInt)
{
    var someData = dataContext.MyEntities.Where(x => x.SomeProperty == someInt);
    // someData always yields no results if someInt is null, even though
    // there are rows in the table that have null for that column.
}

如果someInt为空,则上述方法失败。但这条线有效:

var someData = dataContext.MyEntities.Where(x => x.SomeProperty == null);

为什么我会在第二个中获取数据而不是第一个中的数据?

2 个答案:

答案 0 :(得分:6)

然后,我想,它正在生成并使用需要非空值的表单的SQL查询:

where x.SomeProperty = @param

而不是SQL显示c#null-equality语义:

where x.SomeProperty is null

(这里的关键点是在c#中,null等于null;在ANSI-SQL中,null既不等于null也不会(令人困惑)不等于null - 需要不同的语法来测试空值)

我已经看到LINQ-to-SQL做同样的事情,并且同意它是违反直觉的。我唯一的建议是:自己测试候选参数为null,然后进行常量/文字== null测试。它也可能通过检查和表达树并重写它来做同样的事情,如果你进入表达式树 - 但是特殊的空壳更简单。

答案 1 :(得分:0)

someInt本身不是null。 someInt.Value将为null。