2012-03-19 2 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 - 아니요,하지만 소스를 얻을 수 있습니다. 그것은 잘 작동해야하는 Expression을 만듭니다. 비슷한 기술을 사용하여 RavenDB 프로젝트 중 하나에서 표현식을 구축하고 있습니다. – tvanfosson