2

LINQでは、null許容型を変換せずにnull許容列で不等式テストを実行しても安全ですか?

T-SQLでは、ISNULL()を使用する必要があります。しかし、LINQでは安全に実行できますか?:

mytable.nullablecol != 1
4

2 に答える 2

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つのクエリ)、パラメータを正しいケースのクエリに転送する必要があります。

于 2012-07-12T19:15:19.360 に答える
1

はい、そのようにするのは安全です。

編集:あなたのコメントを考えると、問題はおそらく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 ...;
于 2012-07-12T09:29:23.923 に答える