1

AとBの2つのブールプロパティを持つオブジェクトを検索しているとします。

2つのlinqクエリがある場合はどうなりますか?

IQueryable<ObjectType> query = getIQueryableSomehow()
query.Where(x => x.A);

IQueryable<ObjectType> query2 = getIQueryableSomehow()
query2.Where(x => x.B);

これらのクエリを結合して、これと同等にする方法を教えてください。

IQueryable<ObjectType> query3 = getIQueryableSomehow()
query3.Where(x => x.A || x.B)

query3 = query.Union(query2)を使用したいのですが、残念ながら私のLinqプロバイダーではunionがサポートされていません。

where句をチェーンすることにより、x => xA&&xBの場合を分割します。これは私が意味することです:

IQueryable<ObjectType> query = getIQueryableSomehow();
query = query.Where(x => x.A);
query = query.Where(x => x.B);

またはケースに同様の回避策はありますか?

ありがとう、

アイザック

4

2 に答える 2

6

述語ビルダーの使用

IQueryable<ObjectType> query = getIQueryableSomehow();
var predicate = PredicateBuilder.False<ObjectType>();
predicate = predicate.Or(x => x.A);
predicate = predicate.Or(x => x.B);

var list = query.Where(predicate).ToList();
于 2011-10-17T23:53:24.100 に答える
1

LINQ プロバイダーが Union 演算子をサポートしていない場合は、常に最初に ToArray() を使用してクエリ結果を具体化し、次に LINQ-to-objects プロバイダーを使用してユニオンを実行できます。これは次のようにサポートされています。

IQueryable<ObjectType> query = getIQueryableSomehow() 
query.Where(x => x.A); 

IQueryable<ObjectType> query2 = getIQueryableSomehow() 
query2.Where(x => x.B); 

IQueryable<ObjectType> query3 = query.ToArray().AsQueryable<ObjectType>().Union(query2);

結合される結果が大きすぎない限り、これはうまく機能します。

于 2011-10-17T23:51:57.753 に答える