2011-08-21 90 views
5

我在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?或者当EF值为可为空(父类型为int?)时,EF将它们视为不同的元素。

+0

在实际运行查询之前是否修改了'category'对象? – svick

+0

不,我不知道。我认为@ a1ex01是正确的,如果你不使用常量null,它不会生成IS NULL查询 – willvv

+0

你检查了生成的SQL吗? – svick

回答

2

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

0

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