Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用or语句的RavenDB查询_C#_Ravendb - Fatal编程技术网

C# 使用or语句的RavenDB查询

C# 使用or语句的RavenDB查询,c#,ravendb,C#,Ravendb,我有两个日期(DeliveryDate和EmptyDate)字段,我想使用相同的日期查询文档。因此,如果我查询2016-04-04,且该日期为DeliveryDate或EmptyDate,则查询应返回文档 除了这些字段之外,我还使用了一些其他过滤器,因此查询可以如下所示: var query = _documentSession.Advanced.DocumentQuery<Order, OrdersIndexFields>() .UsingD

我有两个日期(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();
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