我在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会将它们视为不同的元素(Parent的类型为int?)。
答案 0 :(得分:2)
我不是百分百肯定,但我认为第一个语句生成类似SELECT ...
FROM category, eventcategories WHERE category.parent = eventcategories.parent
(如果category.parent为null则返回空记录集),而第二个... WHERE eventcategories.parent IS NULL
。
答案 1 :(得分: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应该将算法调整为仅在需要时测试空值。