我在文档上有两个日期(DeliveryDate和EmptyDate)字段,我想使用相同的日期进行查询。因此,如果我查询2016-04-04并且此日期在DeliveryDate或EmptyDate中,则查询应返回文档。
除了这些字段之外,我还有其他过滤器,因此查询可能如下所示:
currIndex = row * 16 + col;
问题是我使用的OrElse()方法无法按预期工作。上面的查询返回的结果太多了。
如何在RavenDB查询中编写正确的OR语句?
答案 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