2011-08-11 14 views
0

私はLinqからEFを使用し、ObjectSetからFirstOrDefaultエンティティを取得しようとしています。 クエリ次のようになります。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 
      ); 

時々SubTypeIDnullすることができ、この場合には何もp.SubTypeID althogh elemnot.SubTypeIDにreturncedされていないが、両方の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の場合、これら2つのクエリの違いは何ですか?

+0

可能な複製[エンティティフレームワークでnull値をクエリするにはどうすればよいですか?](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