2012-03-19 14 views
3

ORステートメントを使用する実行時にクエリを構築する必要があります。以下の方法を使用してクエリを作成すると、すべてがANDである。このクエリが正しく機能するためには、各フィルタ値をORにする必要があります。RavenDB - ORフィルタを使用した動的クエリの作成

public class IdAndRole 
{ 
    public string Id {get;set;} 
    public string Role {get;set;} 
} 

var idAndRoles = session.Query<IdAndRole, Roles_ById>(); 
foreach(var filter in filterValues) 
{ 
    idAndRoles = idAndRoles.Where(x => x.In(filter.Id) && x.In(filter.Role)); 
} 

擬似コード:

(filter[0].Id == value1 && filter[0].Role == role1) ||(filter[1].Id == value2 && filter[1].Role == role2) 

答えて

2

フィル、 あなたはLuceneQueryに落下することができ、それはあなたのクエリに対するきめの細かい制御が可能になります。

5

クエリを構築するためにPredicateBuilderを使用することができるはずです。

var predicate = PredicateBuilder.False<IdAndRole>(); 
foreach (var filter in filterValues) 
{ 
    predicate = predicate.Or(x => x.In(filter.Id) && x.In(filter.Role)); 
} 

var idAndRoles = session.Query<IdAndRole,Roles_byId>() 
         .Where(predicate); 
+1

これはRavenDB Linqプロバイダに固有です。 Predicate BuilderはRavenDBに存在しません – Phil

+3

@Phil - noしかし、あなたはソースを入手できます。それはちょうどうまく動作するはずのExpressionを構築します。私はRavenDBプロジェクトの1つで式を構築するために同様の手法を使用しています。 – tvanfosson

関連する問題