使用或声明RavenDB查询

时间:2016-04-06 12:13:28

标签: c# ravendb

我在文档上有两个日期(DeliveryDate和EmptyDate)字段,我想使用相同的日期进行查询。因此,如果我查询2016-04-04并且此日期在DeliveryDate或EmptyDate中,则查询应返回文档。

除了这些字段之外,我还有其他过滤器,因此查询可能如下所示:

currIndex =  row * 16 + col;

问题是我使用的OrElse()方法无法按预期工作。上面的查询返回的结果太多了。

如何在RavenDB查询中编写正确的OR语句?

1 个答案:

答案 0 :(得分:1)

在我不知道用了多少小时来解决这个问题之后我才知道RavenDB OpenClause example。我一直在谷歌搜索RavenDB内部语句,然后事实证明RavenDB称他们为子条款:D。我是如何解决我的问题的。

所以上面的代码现在使用RavenDB DocumentQuery API上的Open和End子句方法:

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