4

ANDステートメントをクエリに追加する場合は、次のように実行できます。

query = query.Where(obj=>obj.Id == id);

if(name.HasValue)
  query = query.Where(obj=>obj.Name == name);

そしてそれは私に与えるでしょう:

query.Where(obj=>obj.Id == id && obj.Name == name)

次の結果になるORステートメントを追加するにはどうすればよいですか。

query.Where(obj=>obj.Id == id || obj.Name == name)
4

5 に答える 5

6

ネイティブにはできません。ただし、実行する前にPredicateBuilderを使用してクエリを構成することができ、OR がサポートされます。

var predicate = PredicateBuilder.False<Product>();
predicate = predicate.Or (obj=>obj.Id == id);
if(name.HasValue)  predicate = predicate.Or (obj=>obj.Name == name);

return query.Where(predicate);
于 2012-11-19T21:04:30.360 に答える
3

何かが欠けていない場合は、これだけです:

query.Where(obj=>obj.Id == id || (obj.Name == name && name.HasValue))

この質問 (私の質問...) を読んで、より複雑なシナリオに答えてください:
How to filter IEnumerable based on an entity input parameter

于 2012-11-19T21:04:25.223 に答える
0

問題の一部は、元のクエリを上書きすることです。OR 操作は次のようになります。

subquery1 = query.Where(obj=>obj.Id == id);
subquery2 = query.Where(obj=>obj.Name == name);
query = subquery1.Concat(subquery2).Distinct();

ご覧のとおり、これもかなり扱いにくくなりますが、このフォームを実行する場合は、元のシーケンスを維持して、方程式の右側と左側の両方を処理できるようにする必要があります。重複は削除されます。

その代わりに、ラムダを使用してその条件文を動的に構築する方法を見つけようとします。

私は実際にこれを実行していませんが、このようなものが動作するはずです。

var cond = obj=>obj.Id == id;

...

// need an or
cond = obj=>cond(obj) || obj.Name == name;

query = query.Where(obj=>cond(obj));

これがあなたにアイデアを与えることを願っています。

于 2012-11-19T21:40:47.200 に答える
0

これを単一の条件に組み込むだけです。

if (name.HasValue)
    query = query.Where(obj=>obj.Id == id && obj.Name == name);
else
    query = query.Where(obj=>obj.Id == id);
于 2012-11-19T21:04:45.147 に答える
0

私は gdoron のソリューションを使用しますが、より大きなクエリのセットには実用的ではないと思われる場合は、セット操作を含むもう少し複雑なソリューションが役立つ場合があります。

var queryById = query.Where(obj => obj.Id == id);
var queryByName = query.Where(obj => obj.Name == name);
query = queryById.Union(queryByName);

元のクエリに重複したアイテムが含まれていると、さらに困難になります。

別の方法はExpression、クエリを作成するために使用することです。式ツリーは実行前に変更できるため、Whereサブツリーにさらに条件を追加できます。これは大変な作業であり、99.9% (概算:) のケースではやり過ぎです。

于 2012-11-19T21:30:13.410 に答える