2011-08-21 8 views
5

EFクエリで奇妙な動作が発生しています。なぜ起こっているのか疑問に思っています。エンティティ・フレームワークのクエリでnull値が発生する

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ではありませんか?または値がnull可能であるときにEFはそれらを異なる要素として扱います(Parentはint型です)。

+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がnullの場合は空のレコードセットを返します)のようなものを生成すると思いますが、2番目の... WHERE eventcategories.parent IS NULLです。

0

この記事の詳細な説明は、NULL Value Handling in Entity Frameworkをご覧ください。 EF 5.0,6.0および6.1では、null可能な値が異なって処理されることに注意してください。 EF 5.0では、ヌルを手動でテストする必要があります。 2つの変数間の式の比較では、デフォルトでヌルがテストされません。 UseCSharpNullComparisonBehaviorプロパティをDbContext.ContextOptionsで手動で有効にして、同じ効果を達成することもできます。 EF 6.0では、デフォルトでヌル比較がオンになっていますが、おそらく過度に攻撃的であり、ヌル値ではない列であってもパフォーマンスが低下します。 EF 6.1は、必要に応じてヌルのみをテストするアルゴリズムを調整しているはずです。

関連する問題