LINQでは、null許容型を変換せずにnull許容列で不等式テストを実行しても安全ですか?
T-SQLでは、ISNULL()を使用する必要があります。しかし、LINQでは安全に実行できますか?:
mytable.nullablecol != 1
コンパイル時は安全ですか?はい。
null比較は、意図しない可能性のある行をフィルタリングしますか?はい。これは、データベースのルールに従ってデータベースで実行されます。
foo.X != -1
このコードはnullXを提供しません。それらが必要な場合は、次のようにisnullできます。
(foo.X ?? 0) != -1
また
(foo.HasValue ? foo : 0) != -1
「=」と「is」のクエリ変換について:
int? x = GetId();
var query = from foo in bar
where foo.X == x
select foo;
//LinqToSql examines the x
// you get an "is" comparison when x is null
// you get an "=" comparison when x is not null
翻訳の問題が発生する可能性があるのは、コンパイルされたクエリです。コンパイルされたクエリは、パラメータを検査して翻訳を調整することはできません。その場合、ケースごとに1つのコンパイル済みクエリを作成し(1つのnull許容パラメータに対して2つのクエリ)、パラメータを正しいケースのクエリに転送する必要があります。
はい、そのようにするのは安全です。
編集:あなたのコメントを考えると、問題はおそらくnull == -1
(SQLでは)trueではなくnullの結果になることです。したがって、次のクエリを使用できます。
mytable.nullablecol != 1 || mytable.nullablecol == null
トリッキーになるのは、 nullの可能性のある値と等しいかどうかを比較する場合です。明示的にそれに対応する必要があります。例えば:
int? x = GetId();
var query = from foo in bar
where foo.X == x || (foo.X == null && x == null)
select ...;