エンティティフレームワークでnull値を問い合わせるにはどうすればよいですか?

.net ado.net entity-framework

質問

このようなクエリを実行したい

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

IS NULL生成します。

編集:最初の2つの答えの後、私はEntity Frameworkを使っていて、Linq to SQLを使っていないことを明確にする必要があると感じます。 object.Equals()メソッドはEFでは機能しないようです。

編集2:上記のクエリは意図したとおりに機能します。正しくIS NULLを生成し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からエンティティへの回避策(痛い!):

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

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


編集: このバグはEF 4.5で修正されています!このバグを支持してくれてありがとう!

後方互換性のため、オプトインになります - entry == value機能するように手動で設定を有効にする必要があります。この設定が何であるかについては、まだ何も語っていません。乞うご期待!


編集2: EFチームによるこの投稿によると、 この問題はEF6で修正されました!ウーホー!

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

つまり、古い振る舞いに依存する既存のコードnull != null 、ただし変数と比較する場合のみ)は、その振る舞いに依存しないように変更するか、またはUseCSharpNullComparisonBehaviorをfalseに設定して古い壊れた振る舞いを使用します。


人気のある回答

Entity Framework 5.0以降、問題を解決するために次のコードを使用できます。

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

Entity Framerworkは 'C#のような' null比較を使用するので、これはあなたの問題を解決するはずです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ