【问题标题】:Why does EF not return any results when comparing null variable?为什么比较空变量时EF不返回任何结果?
【发布时间】:2012-03-15 04:14:31
【问题描述】:

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

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);

为什么我在第二个中得到数据而不是第一个?

【问题讨论】:

  • 试试someInt.Value。可空类型实际上不是空的,但它的值是。
  • @MystereMan 我刚刚测试了这个。请参阅 Ryan Bennett 对答案的评论。不过这是个好主意。
  • @MystereMan 在语义上,它 is null - 说“它的值是”是不正确的:一个空的 nullable-T 没有 一个值,所以思考这个不存在的值的本质是没有意义的
  • @MarcGravell - 我不确定你所说的“一个空的可为空的-T”是什么意思。如果你引用一个 nullable-t 的 .Value,但它没有,它返回 null。
  • @MystereMan 否,因为int?.Value 的类型为int,不能为空。

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


【解决方案1】:

那么,我猜它正在生成并使用一个期望非空值形式的 SQL 查询:

where x.SomeProperty = @param

代替 SQL 来显示 c# 空相等语义:

where x.SomeProperty is null

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

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

【讨论】:

  • 是的,您可能无法绕过对 someInt 的空检查。同意
  • 感谢您的帮助。最后,我的声明看起来像 .Where(x => someInt.HasValue ? x.SomeProperty == someInt : x.SomeProperty == null) 并且工作正常 :)
  • @Alex 我会以另一种方式来做,个人:if(foo==null) query = query.Where(x=>x.Foo==null) else query = query.Where(x=>x.Foo==foo) - 但不管用什么都好
  • @AlexFord - 我可能会做.Where(x => x.SomeProperty == someInt ?? null) (我知道,使用空合并的愚蠢方式,但我认为它应该可以工作)
  • 有什么特别的原因吗?我只喜欢我的,因为它在一条线上并且不太长。
【解决方案2】:

someInt 本身不为空。 someInt.Value 将为空。

【讨论】:

  • 我刚刚测试了这个。 .Where(x => x.SomeProperty == someInt.Value) 仍然没有返回任何结果。 .Where(x => x.SomeProperty.Value == someInt.Value) 也不返回任何结果。
  • someInt.Value 不能为空,因为它被声明为int,它永远不能为空。
  • 今天学到了一些东西。谢谢
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多