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;}
}

「Apple」という製品のLineItemを持たないすべての注文を返すクエリを作成する方法を理解しようとしています。

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 に答える
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()
}

デフォルトでは、(ravendb によって設定された制限のため) 128 レコードのみが返されることに注意してください。クエリ結果に 128 を超えるレコードがある場合は、Take(recordsNeeded)関数を使用してデータを取得する必要があります。

于 2012-12-06T06:52:11.917 に答える