1

重複の可能性:
Linq - LINQ クエリを動的に作成するときに OrWhere 式をシミュレートしますか?

誰かが私を助けることができるかどうか疑問に思っていました。

エンティティ フレームワークでは、たとえば where を連鎖できることを知っています。

data.Where(x=>x.Id == id ).Where(x=>x.Name == name).Where(x=>x.State == state);

基本的に where は AND に変換されます

data.Where(x=>x.Id==id && x.Name == name && x.State == state);

ORで同じことをする方法はありますか

data.Where(x=>x.Id==id || x.Name == name || x.State == state);

...として表すことができます

4

2 に答える 2

5

これを行う最良の方法は、 Predicate Builderを使用することだと思います

于 2012-10-11T17:15:17.107 に答える
0

すぐに使えるLinqメソッドに関しては、短い答えは「いいえ」です。理由は次のとおりです。

IQueryable<T>OP がと ではなくを扱っていることは理解してIEnumerable<T>いますが、前者で使用できる機能は後者に基づいています。

IEnumerable<T>Linq (または Linq to Objects) は、コレクションが反復されるまでさまざまな linq メソッドの実行を延期することによって機能します。反復が開始された場合でも、コレクション内の次のアイテムを生成するために必要な作業のみを行います。

WHERE について話しているので、フィルタリング関数について話しているのです。あなたが持っているとしましょうBase.Where(ConditionA).Where(ConditionB).Where(ConditionC)。実行時に、これは、条件を満たす最初の項目が見つかるまで基本コレクションを反復処理することによって処理され、ConditionAその項目が次の関数に渡されます。アイテムが を満たす場合ConditionBは に渡されConditionC、アイテムが を満たさない場合はに次のアイテムConditionBConditionB要求し、 は次のアイテムを取得ConditionAするために、を満たす別のアイテムが見つかるまでConditionAを反復し続けます。次に、新しいアイテムがそれを満たしているかどうかをテストします。BaseConditionAConditionB

このタイプのワークフローに が存在しない理由.OrWhere()は、前のステートメントがその結果をそのような関数に渡していることを認識している必要があり、基本的に遭遇するすべてのアイテムを渡す必要があるためです (たとえ条件が満たされていない) だけでなく、条件が満たされているかどうかに関係なく、長い経過をたどります。これにより、単純な操作が大幅に複雑になります。

お役に立てれば...

于 2012-10-11T17:35:47.180 に答える