C# 使用or语句的RavenDB查询
我有两个日期(DeliveryDate和EmptyDate)字段,我想使用相同的日期查询文档。因此,如果我查询2016-04-04,且该日期为DeliveryDate或EmptyDate,则查询应返回文档 除了这些字段之外,我还使用了一些其他过滤器,因此查询可以如下所示:C# 使用or语句的RavenDB查询,c#,ravendb,C#,Ravendb,我有两个日期(DeliveryDate和EmptyDate)字段,我想使用相同的日期查询文档。因此,如果我查询2016-04-04,且该日期为DeliveryDate或EmptyDate,则查询应返回文档 除了这些字段之外,我还使用了一些其他过滤器,因此查询可以如下所示: var query = _documentSession.Advanced.DocumentQuery<Order, OrdersIndexFields>() .UsingD
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();
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
var query=\u documentSession.Advanced.DocumentQuery()
.使用默认运算符(查询运算符和);
query.WhereBetweenOrEqual(OrdersIndexFields.DeliveryInfo\u DeliveryDateUtc,
predicate.LocalDeliveryFrom.Value,
predicate.LocalDeliveryTo.Value);
query.OrElse().WhereBetweenOrEqual(OrdersIndexFields.EmptyOrderDoneDate,
predicate.LocalDeliveryFrom.Value,
predicate.LocalDeliveryTo.Value);
query.WhereEquals(OrdersIndexFields.Status,predicate.Status);
查询
.Skip(0)。Take(1024)
.ToArray();
问题是我使用的OrElse()方法没有按预期工作。上面的查询返回的结果太多
如何在RavenDB查询中编写正确的OR语句?在我不知道用了多少小时来解决这个问题后,我被这个问题难住了。我一直在谷歌上搜索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查询中的“内部or语句”周围添加括号。所以在查询看起来像这样之前:
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();
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
您使用Lucene查询API而不是标准的Raven LINQ查询API有什么原因吗?@JudahHimango我使用索引中的连接集合字段进行过滤,据我所知,索引字段上不可能进行LINQ过滤,因此我必须坚持使用Lucene查询API