2016-04-06 70 views
0

我有兩個日期(DeliveryDate和EmptyDate)字段上的文檔,我想查詢使用相同的日期。所以,如果我查詢2016-04-04和這個日期是在DeliveryDate或EmptyDate查詢應該返回文檔。RavenDB查詢使用或語句

除了這些以場我也severale其他過濾器,以便查詢看起來是這樣的:

var query = _documentSession.Advanced.DocumentQuery<Order, OrdersIndexFields>() 
       .UsingDefaultOperator(QueryOperator.And); 

query.WhereBetweenOrEqual(OrdersIndexFields.DeliveryInfo_DeliveryDateUtc, 
predicate.LocalDeliveryFrom.Value, 
predicate.LocalDeliveryTo.Value); 

query.OrElse().WhereBetweenOrEqual(OrdersIndexFields.EmptyOrderDoneDate, 
predicate.LocalDeliveryFrom.Value, 
predicate.LocalDeliveryTo.Value); 

query.WhereEquals(OrdersIndexFields.Status, predicate.Status); 

query 
    .Skip(0).Take(1024) 
    .ToArray(); 

的問題是,預期我使用OrElse運算()方法不起作用。上述查詢返回的結果太多。

如何在RavenDB查詢中編寫正確的OR語句?

+0

是否有你使用Lucene的查詢API的理由,而不是標準的Raven LINQ查詢API? –

+0

@JudahHimango我從我的索引使用連接的集合字段進行過濾,並且據我所見,不可能在索引字段上執行linq過濾,因此我必須堅持使用Lucene查詢API – Poku

回答

1

在我不知道用了多少小時來解決這個問題之後,我對這個RavenDB OpenClause example st了st。我一直在使用RavenDB內部語句後搜索,然後RavenDB調用它們子句:D。任何我如何解決我的問題。

所以我上面的代碼現在工作使用打開並結束對RavenDB DocumentQuery API節的方法:

query.OpenSubclause(); 
query.WhereBetweenOrEqual(OrdersIndexFields.DeliveryInfo_DeliveryDateUtc, 
predicate.LocalDeliveryFrom.Value, 
predicate.LocalDeliveryTo.Value); 

query.OrElse().WhereBetweenOrEqual(OrdersIndexFields.EmptyOrderDoneDate, 
predicate.LocalDeliveryFrom.Value, 
predicate.LocalDeliveryTo.Value); 
query.CloseSubclause(); 

這增加了圍繞Lucene的查詢我的「內部或聲明」括號。查詢看起來像這樣所以之前:

DeliveryInfo_DeliveryDateUtc:[2016-03-31T22:00:00.0000000Z TO 2016-04-27T22:00:00.0000000Z] OR EmptyOrderDoneDate:[2016-03-31T22:00:00.0000000Z TO 2016-04-27T22:00:00.0000000Z] AND Status:None 

,加入開放結束後子條款看起來這給了我預期的結果:

(DeliveryInfo_DeliveryDateUtc:[2016-03-31T22:00:00.0000000Z TO 2016-04-27T22:00:00.0000000Z] OR EmptyOrderDoneDate:[2016-03-31T22:00:00.0000000Z TO 2016-04-27T22:00:00.0000000Z]) AND Status:None