【问题标题】:RavenDB query using or statementRavenDB 查询使用 or 语句
【发布时间】:2016-04-14 20:25:34
【问题描述】:

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

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

    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 语句?

【问题讨论】:

  • 您使用 Lucene 查询 API 而非标准 Raven LINQ 查询 API 是否有原因?
  • @JudahHimango 我正在使用索引中的连接集合字段进行过滤,据我所知,无法对索引字段进行 linq 过滤,因此我必须坚持使用 Lucene 查询 API

标签: c# ravendb


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多