1. ホーム
  2. .net

[解決済み] エンティティフレームワークでNULL値を問い合わせるにはどうすればよいですか?

2022-11-11 18:57:23

質問

次のようなクエリを実行したいのですが

   var result = from entry in table
                     where entry.something == null
                     select entry;

を取得し IS NULL が生成されます。

編集しました。 最初の2つの回答の後、私は私がEntity Frameworkを使用していることを明確にする必要性を感じています。 とLinq to SQLではありません。オブジェクト.Equals()メソッドはEFで動作しないようです。

編集No.2。 上記のクエリは意図したとおりに動作します。それは正しく生成されます IS NULL . しかし、私のプロダクションコードは

value = null;
var result = from entry in table
                         where entry.something == value
                         select entry;

で、生成されたSQLは something = @p; @p = NULL . EFは定数式を正しく変換しますが、変数が含まれる場合は通常の比較と同じように扱われるようです。実際に理にかなっています。私はこの質問を閉じます。

どのように解決するのですか?

Linq-to-SQLの回避策です。

var result = from entry in table
             where entry.something.Equals(value)
             select entry;

Linq-to-Entities(痛い!)に対するワークアラウンド。

var result = from entry in table
             where (value == null ? entry.something == null : entry.something == value)
             select entry;

これは私が何度か噛まれたことのある厄介なバグです。 のバグレポートをご覧ください。 にアクセスし、このバグがあなたにも影響したことをマイクロソフトに知らせてください。


編集します。 このバグはEF 4.5で修正されています。 ! このバグに投票してくれた皆さん、ありがとうございました!

後方互換性のために、これはオプトインになります - 手動で設定を有効にして entry == value を動作させるには、手動で設定を有効にする必要があります。 この設定が何であるかはまだわかりません。 ご期待ください。


2を編集します。 によると この記事 によるもので、EFチームによるものです。 この問題はEF6で修正されました! Woohoo!

3値ロジックを補うために、EF6のデフォルトの動作を変更しました。

これは、古い動作に依存する既存のコードが ( null != null ただし、変数と比較するときのみ) は、その動作に依存しないように変更するか、あるいは UseCSharpNullComparisonBehavior を false に設定して古い壊れた動作を使用する必要があります。