2011-08-21 93 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應該已經調整了算法,只在需要時測試空值。