7

VB.Net にはいくつかのプロジェクトがあり、SQL クエリの多くに .Net Framework 4 と Linq to Entities を使用しています。EF への移行は私たちにとって新しいシフトであり (約 4 ~ 6 か月間使用しています)、コーディングを大幅に高速化できるため、上層部の支持を得ています。私たちはまだ多くのストアド プロシージャを使用していますが、Linq to Entities を介してそれらを実行することさえあります。

混乱を解消したいと思っていますが、意味のある直接的な答えが見つかりません。特定のフィールドに NULL 値を持つレコードが必要なクエリがいくつかあります。これらは単純な選択クエリであり、集計や左結合などはありません。Microsoft は、次のMSDN リンクのようなクエリを推奨しています。

dim query = from a in MyContext.MyTables
Where a.MyField = Nothing
Select a

私はこれを正確に行ういくつかのプロジェクトを持っていますが、IDE で警告はなく、うまく機能します。最近、新しいプロジェクトが別の開発者によって作成され、彼が上記のように null チェックを行ったときに、IDE で次の警告が表示されます。

警告 1 この式は常に Nothing と評価されます (equals 演算子からの null 伝搬のため)。値が null かどうかを確認するには、'Is Nothing' の使用を検討してください。

プロジェクトを比較すると、それぞれにオプション explicit とオプション strict がオンになっています。警告を無視すると、アプリの実行時に探している正確なレコード セットが取得されます。= 記号を IS に変更すると、警告が消えます。しかし、なぜこの警告が 1 つのプロジェクトで表示され、他のプロジェクトでは表示されなかったのでしょうか? MSDN でも等号演算子を使用した例があると混乱します。

4

3 に答える 3

6

生成された列はNullable(Of T)

したがって、そのフィールドに値があるかどうかを次のように確認できます。

dim query = from a in MyContext.MyTables
Where Not a.MyField.HasValue
Select a
于 2012-07-10T19:24:06.717 に答える
2

MyFieldここに表示されているのは、それがNullable(Of T)タイプだと思います。おそらくプリミティブ、、IntegerなどSingle...

この警告が表示される理由は、コンパイラがプリミティブ型の通常の等価演算子をNullable(Of T)バージョンに昇格させるためです。基本的に次のことを実行します

Dim myField As Integer? = a.MyField
Dim other As Integer? = Nothing
If myField = other Then
 ...
End If

ただし問題Integer?は、値がある場合、Nothingそれは何とも等しくないということです。したがって、上記のWhere句は常に を返しFalseます。コンパイラは、この問題のあるコーナーについて警告し、 null 以外の値がある かどうかを判断するチェックにNullable(Of T)プッシュしようとしています。Is Nothinga.MyField

このブログ記事には、この警告が生成される理由とその背後にあるすべてのメカニズムについての非常に詳細な説明があります。この記事は C# 向けに書かれていますが、基本的な前提は VB.Net にも当てはまります。

于 2012-07-10T18:52:23.407 に答える
0

少なくともオブジェクトへの LINQ では、代わりにこれを使用できます。

Nullable(Of Integer).Equals(a, b)

これは、Nothing である 2 つの値のいずれかまたは両方で正常に機能します。

于 2017-10-11T13:31:52.367 に答える