2012-03-19 30 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 2012-03-19 21:06:07

+3

@Phil - 不,但您可以获得源代码。它构建了一个应该工作得很好的表达式。我正在使用一些类似的技巧在我的一个RavenDB项目中构建表达式。 – tvanfosson 2012-03-19 21:10:53