2016-06-21 8 views
1

申し訳ありませんが、私はそうのようなオブジェクトを返すようにしたい...LINQネストされた条件

を検索し、ダース関連記事について通読が、かなり私が必要なものを見つけることができませんでしたしました:

((Status == 1 || Status == 2) && Value = 'Green') 

私はSQLでできるので、私はLinqで括弧を使うことはできません。私は、次のことを試してみた:

list.Where(x => x.Status == 1 || x.Status == 2) 
    .Where(x => x.Value == 'Green') 

// or... 
list.Where(x => x.Value == 'Green') 
    .Any(x => x.Status == 1 || x.Status == 2) 

// or... 
list.Where(x => x.Status == 1 || x.Status == 2) 
    .Any(x => x.Value == 'Green') 

(またはその複数の他のバリエーション)

は、任意のより多くの「正しい」他よりも一つの方法でありますか?

私はそれからいくつかの結果を棍棒ことができますが、私は2つの主な懸念があります。

  1. 受け入れのベストプラクティス(1が存在する場合)で、かつ
  2. 私のインデックスが状況に合わせて最適化されていますpredicate first ... Linqはこれを実現するのに十分スマートであるか、あるいは上記の特定のバージョンはインデックス述語が最適な順序で伝播されることを保証しますか?
あなたの表現が動作するはず
+2

x =>((x.Status == 1 || x.Status == 2)&& x.Value = 'Green') ' – dasblinkenlight

+0

@dasblinkenlight - 何も間違っていません...それが最初でした私が試したことはありますが、私は構文が間違っていたに違いありません(実際の状態はもっと複雑です)。あなたのコメントは私にそれを再試行するように促しました、そして今はよく見えます。私の質問で#2についてまだ半分好奇心が強いですが、あなたが答えとしてあなたのコメントを投稿すれば、私はそれをマークします。ありがとう – jleach

答えて

0

.Where(x => (x.Status == 1 || x.Status == 2) && x.Value = 'Green') 

選択肢のリストから、最初の式、すなわち

list.Where(x => x.Status == 1 || x.Status == 2) 
    .Where(x => x.Value == 'Green') 

その論理等価です。 LINQがいくつかのRDBMSに変換されるとき、これら2つのアプローチは同等のSQLを生成します。 LINQがメモリで使用されると、2つのWhere句が順番に実行されますが、全体的な結果は同じです。

Any(...)が結果の中で述語に一致するレコードの有無に応じてtrueまたはfalseを生成するため、#2と#3の選択肢は同じではありません。