4

簡単な LINQ クエリを次に示します。

var objs = db.Objects.Where(o => o.Field1 == val);

これは SQL クエリに変換されます。

select * from [Object] where Field1 = @p1

問題は、 の値がval合法的に null になる可能性があることです。また、SQL は null の比較を好みません。それは構文を主張します... where Field1 is null

??/isnull操作を使用する以外に、これをきちんと行う方法はありますか?

4

2 に答える 2

4

これも、LINQ サポートにおける EF の弱点です。古き良き LINQ to SQL は、val のランタイム値に応じて、これを適切に変換しました。

これで行くことをお勧めします:

var objs = db.Objects.Where(
   o => (o.Field1 == val) || (o.Field1 == null && val == null));

EF がこれを文字通りに変換すると、SQL Server クエリ オプティマイザは実際にこのパターンを取得し、「null と等しい」チェックに最適化します。このコード パターンを使用してインデックスを検索することもできます。クエリ プランでは、これは とISは対照的にとして表示されEQます。

于 2013-01-27T14:23:42.117 に答える
0

.HasValueはどうですか?

var objs = db.Objects.Where(o => !o.Field1.HasValue && o.Field1 == val);
于 2013-01-27T15:39:15.350 に答える