5

鉴于:

public class Order
{
    public string Name {get;set;}
    public List<LineItem> LineItems {get; set;}
}

public class LineItem
{
   public string Product {get; set;}
   public int Quantity {get; set;}
}

我试图弄清楚如何构建一个查询,该查询将返回所有没有LineItem 的订单,其产品名为“Apple”

4

3 回答 3

4

我一直在考虑这个问题。它出现了几次。问题是 Raven 当前不处理 !.Any() 或 .All() 查询。

这个特殊的例子充分简化了问题,让我想到了一条不同的道路。我相信有一个解决方案。它需要针对静态索引的 lucene 查询:

public class Orders_ByProduct : AbstractIndexCreationTask<Order>
{
  public Orders_ByProduct()
  {
    Map = orders => from order in orders
                    select new
                    {
                        Product = order.LineItems.Select(x => x.Product)
                    };
  }
}

var ordersWithoutApple = session.Advanced
                                .LuceneQuery<Order, Orders_ByProduct>()
                                .Where("*:* AND -Product: Apple")
于 2012-12-05T21:58:24.683 回答
3

!.Any我们能够通过显式比较来解决 RavenDB 缺乏对 的支持false,例如:

orders.Where(x => x.LineItems.Any(y => y.Product == "Apple") == false)
于 2016-05-02T22:40:17.337 回答
2

您可以通过为查询创建索引来做到这一点

public class GetOrdersByProductIndex: AbstractIndexCreationTask<Order,GetOrdersByProductIndex.Result>
{
  public class Result
  {
     public string Product {get; set;}
  }

  public GetOrdersByProductIndex()
  {
    Map = orders => from order in orders
                    select new
                    {
                        Product = order.LineItems.Select(x => x.Product)
                    };
  }
}

现在您可以使用此索引来获取您的订单。您的查询应如下所示

 using(IDocumentSession session = docStore.OpenSession())
{
   var orders  = session.Query<GetOrdersByProductIndex.Result,GetOrdersByProductIndex>
                        .Where(x=>x.Product != "Apple")
                        .As<Order>()
                        .ToList()
}

请注意,默认情况下它只会返回 128 条记录(由于 ravendb 设置的限制),如果您的查询结果超过 128 条记录,您应该使用Take(recordsNeeded)函数来获取数据。

于 2012-12-06T06:52:11.917 回答