2012-07-10 6 views
5

私たちは、多くのSQLクエリに対して.Net Framework 4とLinq to Entitiesを使用してVB.Netにいくつかのプロジェクトを持っています。 EFへの移行は、私たちのための新たな転換です(約4〜6ヶ月間使用しています)。私たちはまだたくさんのストアドプロシージャを使用していますが、Linqからエンティティへもそれらを実行します。VB.NetエンティティへのLinq Null比較 - 'Nothing'または 'Nothing'は何ですか?

私はいくつかの混乱を解消することを望んでおり、意味をなさない直接の回答は見つかりません。特定のフィールドがNULL値を持つレコードが必要なクエリがいくつかあります。私はまさにこれを行うと、それは素晴らしい作品いくつかのプロジェクト、IDEで警告なしを持って

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

:これらは、単純なSELECTクエリ、何の凝集体または左が参加していない、などですマイクロソフトでは、このMSDN Linkようなクエリを見て何かを推奨しています。最近、新しいプロジェクトが別の開発者によって作成され、上記のようなnullチェックを行ったときにIDEでこの警告が表示されます。

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

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

+0

VB.NET LINQには、「等しい」キーワードもあります。私はそれをテストする方法はありませんが、おそらく代わりにそれを試してみませんか? 'a.MyFieldは何もない ' –

+0

@Cory:' Join'節(AFAIK)でのみ使用されるコンテキストキーワードです。私はあなたがどこにでもそれを使うことができるとは思わない。 –

答えて

2

私はあなたがここに見ているものは、MyFieldNullable(Of T)タイプであると信じています。コンパイラはNullable(Of T)バージョンにプリミティブ型のため、通常の等価演算子を促進するため、この警告メッセージが表示されている

...など、 SingleIntegerそうな原始的理由があります。それは本質的にかかわらず、次の

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

問題を実行Integer?が値Nothingを持っているとき、それは何に等しいとしないことです。したがって、上記Where句は常にFalseを返します。コンパイラは、この問題のある角(Nullable(Of T))について警告し、にnull以外の値があるかどうかを調べるIs Nothingチェックにプッシュします。

このブログ記事には、なぜこの警告が生成されているのか、その背後にあるすべての仕組みについての非常に詳細な説明があります。この記事はC#用に書かれていますが、基本的な前提はVB.Netにも当てはまります。

+0

したがって、フィールドがNULL可能ではなく、NULL可能であるため別の構文を必要とするため、別の問合せの問題であったため、この権利を理解すると、等号は1つの問合せで機能しました。 –

+0

@ChrisJonesが正しい。通常は、 '='をヌル可能な値と共に使用することができます。 'Nothing'との比較では' False'が返されますが、コンパイラが警告を出します。 – JaredPar

+0

もう少しで遊んで、私はできるのですが、データベースでnullableであるが他のデータではない文字列フィールドには何もしませんAfshinが言及したIs NothingまたはHasValueメンバーを使用することができます。これについていくつか明言してくれてありがとう。 –

5

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

だから、あなたはこのようにそのフィールドに値を持っているかどうかを確認たりすることはできませんする必要があります:

dim query = from a in MyContext.MyTables 
Where Not a.MyField.HasValue 
Select a 
+0

私はこれをいくつかのデータ型で試しましたが、文字列値では機能しませんでした。 null値の整数、日付、およびブール型のデータ型に対してHasValueメンバーを使用することができました。 –

0

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

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

これは、両方でうまく動作し、2つの値のどちらもNothingではありません。

関連する問題