RavenDB 查询使用 or 语句
RavenDB query using or statement
我在一个文档上有两个日期(DeliveryDate 和 EmptyDate)字段,我想使用相同的日期进行查询。因此,如果我查询 2016-04-04 并且此日期在 DeliveryDate 或 EmptyDate 中,则查询应该 return 文档。
除了这些字段之外,我还有其他几个过滤器,因此查询可能如下所示:
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() 方法没有按预期工作。上面的查询 return 结果太多。
如何在 RavenDB 查询中编写正确的 OR 语句?
在我不知道用了多少小时来解决这个问题之后,我被这个 RavenDB OpenClause example 绊倒了。我一直在谷歌搜索 RavenDB 内部声明,然后结果发现 RavenDB 称它们为 subclause :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 查询中的 "inner or statement" 周围添加括号。所以在查询看起来像这样之前:
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
我在一个文档上有两个日期(DeliveryDate 和 EmptyDate)字段,我想使用相同的日期进行查询。因此,如果我查询 2016-04-04 并且此日期在 DeliveryDate 或 EmptyDate 中,则查询应该 return 文档。
除了这些字段之外,我还有其他几个过滤器,因此查询可能如下所示:
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() 方法没有按预期工作。上面的查询 return 结果太多。
如何在 RavenDB 查询中编写正确的 OR 语句?
在我不知道用了多少小时来解决这个问题之后,我被这个 RavenDB OpenClause example 绊倒了。我一直在谷歌搜索 RavenDB 内部声明,然后结果发现 RavenDB 称它们为 subclause :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 查询中的 "inner or statement" 周围添加括号。所以在查询看起来像这样之前:
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