我在实体框架中的数据上下文中选择数据时遇到问题,我将其缩小到查询空值。我有这样的方法:
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);
为什么我会在第二个中获取数据而不是第一个中的数据?
答案 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。