【问题标题】:Entity framework null value in query查询中的实体框架空值
【发布时间】:2014-07-10 02:44:41
【问题描述】:

我在 EF 查询中看到了一个奇怪的行为,我想知道为什么会这样。 使用以下代码,我没有得到任何结果:

if (category.Parent == null)
{
    return Db.EventCategories.Where(c => c.Parent == category.Parent);
}

但是使用这段代码,它确实返回了预期的结果:

if (category.Parent == null)
{
    return Db.EventCategories.Where(c => c.Parent == null);
}

有什么区别? null 不总是 null 吗?或者当值是可空的(Parent 是 int 类型?)时,EF 是否将它们视为不同的元素。

【问题讨论】:

  • 在实际运行查询之前是否修改了category 对象?
  • 不,我不知道。我认为@a1ex01 是对的,如果你不使用常量 null 它不会生成 IS NULL 查询
  • 你检查生成的SQL了吗?

标签: .net entity-framework null


【解决方案1】:

我不是 100% 确定,但我认为第一个语句会生成类似 SELECT ... FROM category, eventcategories WHERE category.parent = eventcategories.parent 的内容(如果 category.parent 为空,则返回空记录集),而第二个语句会生成 ... WHERE eventcategories.parent IS NULL

【讨论】:

    【解决方案2】:

    请看这篇文章的详细解释:NULL Value Handling in Entity Framework。请注意,EF 5.0、6.0 和 6.1 处理可空值的方式不同。在 EF 5.0 中,您将需要手动测试空值;默认情况下,两个变量之间的方程比较不会测试空值。您也可以在 DbContext.ContextOptions 中手动开启 UseCSharpNullComparisonBehavior 属性以达到相同的效果。在 EF 6.0 中,默认情况下会打开 null 比较,但可能过于激进,甚至在不可为 null 的列上,这会导致性能下降。 EF 6.1 应该对算法进行了调整,以便仅在需要时测试空值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2021-12-25
      相关资源
      最近更新 更多