2011-08-11 161 views
0

我使用Linq到EF並嘗試從ObjectSet獲取FirstOrDefault entitiy。 查詢看起來是這樣的:null Linq查詢

 Notification not = new Notification(); 
     ........ 
     //not.SubTypeID = null; 

     var elem = ent.Notifications.FirstOrDefault(p =>      
        p.ID == not.ID && 
        p.SubTypeID == not.SubTypeID && 
        p.Location == not.Location && 
        p.TypeID == ns.TypeID 
      ); 

有時SubTypeID可以null在這種情況下沒有什麼elem是returnced althogh p.SubTypeIDnot.SubTypeID都是null

但奇怪的是,當我運行此查詢:

 var elem = ent.Notifications.FirstOrDefault(p =>      
        p.ID == not.ID && 
        p.SubTypeID == null && 
        p.Location == not.Location && 
        p.TypeID == ns.TypeID 
      ); 

一切正常,我在elem看到的數據。

所以我做錯了什麼,當這兩個查詢有什麼不同時not.SubTypeIDnull

+0

可能重複的[我如何查詢空值在實體框架?](http://stackoverflow.com/questions/682429/how-can-i-query-for-null-values-in-entity-框架) –

回答

1

在C#中,null == null的結果爲true。但是在表達式樹被編譯進去的SQL中,NULL = NULL的結果是NULL。 PostgreSQL的例子:

SELECT 1 WHERE NULL = NULL; 
?column? 
---------- 
(0 rows) 

你可能會考慮使用類似的表達式:

p.SubTypeID == not.SubTypeID || 
(p.SubTypeID == null && not.SubTypeID == null) 

這是怎樣的一個黑客攻擊,並有可能比這個更好的解決方案。但NULL = NULL測試可能是您的問題的根源。

+0

謝謝,它的工作原理。 – NDeveloper