2016-04-14 23 views
-1

私はアプリケーションでlinqを使用しています。クエリにはいくつかの条件があります.Where(a => !one || a.id == 1)複数の条件linq

bool one = false; 
bool two = false; 
bool three = false; 

db.type.Where(w => !one|| w.id == 1).Where(w => !two || w.id == 2).Where(w => !three || w.id == 3).ToList() 

しかし、このクエリは結果私を与える:

db.type.Where(w => w.id == 1 && 
        w.id == 2 && 
        w.id == 3) 

私が取得したい:

db.type.Where(w => w.id == 1 || 
        w.id == 2 || 
        w.id == 3) 

は私を助けてください。どうすればこの問題を解決できますか?あなたはどこ述語内のIDをorする必要がある場合は

+0

複数の 'Where'を連鎖することは、使用される基準の' &&'を用いて 'Where'と単一のものに等価です。私はあなたがこの技術で '||'をシミュレートすることができないことが分かると思います。 –

+0

@IvanStoev私はこれを他の手法で修正できますか? – ukrainianDev

+0

サンプルの入出力データを入力してください。変数 'one'とid'1'の間には関係がありますか? – RePierre

答えて

0

あなたは、このようEnumerable.Contains()メソッドを使用することができます。

var ids = new[]{1, 2, 3}; 
db.type.Where(w => ids.Contains(w.id)); 

をしかし、私がしたいを想定しを動的Whereための述語を作成する方法であります私のことを信じて、フラグを使ったり条件を使ったりするのはこれを行う方法ではありません。 この条件では、他の人がそのコードを読んでしまうだけでなく、クエリのパフォーマンスが悪い場合もあります。 これを行う適切な方法は、PredicateBuilderを使用することです。その記事をどのように使うべきか、それが何をするかを見るために記事を見てください。

ただし、注意が必要です。Entity FrameworkまたはnHibernateでは機能しません。上記のORM用に作成するには、Universal predicate builderのこのブログ記事を使用してください。

+0

助けてくれてありがとう、私はUniversal predicate builderを使用していて、述語クラスは私に結果を与えている! – ukrainianDev