2012-03-19 32 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