2012-04-04 1 views
0

この質問は、次の質問(複数可)これらの要件を前提として、この文書のRavenDb where句を作成するにはどうすればよいですか?

インデックスに基づいています:How to construct a proper WHERE clause with RavenDb

質問の本質は、私は動的にフィールドを追加または削除しますか参加する方法です:ページングと句シンプルHow do I construct my RavenDb static indexes for this document, given these requirements?

どこの句で?

ドキュメント:

[Serializable] 
public class Product 
{ 
    public string AveWeight { get; set; } 

    public string BrandName { get; set; } 

    public string CasePack { get; set; } 

    public string Catalog { get; set; } 

    public decimal CatalogId { get; set; } 

    public decimal CategoryId { get; set; } 

    public string Info { get; set; } 

    public bool IsOfflineSupplierItem { get; set; } 

    public bool IsRebateItem { get; set; } 

    public bool IsSpecialOrderItem { get; set; } 

    public bool IsSpecialPriceItem { get; set; } 

    public bool IsTieredPricingItem { get; set; } 

    public string ItemNum { get; set; } 

    public string ManufactureName { get; set; } 

    public string ManufactureNum { get; set; } 

    public decimal OffineSupplierId { get; set; } 

    public string PackageRemarks { get; set; } 

    public decimal Price { get; set; } 

    public decimal PriceGroupId { get; set; } 

    public decimal ProductId { get; set; } 

    public string ProductName { get; set; } 

    public int Quantity { get; set; } 

    public string SupplierName { get; set; } 

    public string UOM { get; set; } 

    public string Upc { get; set; } 

    public string Url { get; set; } 

} 

インデックス:

if (store.DatabaseCommands.GetIndex("Products_Index") == null) 
{ 
    store.DatabaseCommands.PutIndex("Products_Index", new IndexDefinitionBuilder<Product> 
    { 
     Map = products => from p in products 
          select new { p.CatalogId, 
             p.HasPicture, 
             p.INFO2, 
             p.IsOfflineSupplierItem, 
             p.IsRebateItem, 
             p.IsSpecialOrderItem, 
             p.IsSpecialPriceItem, 
             p.IsTieredPricingItem, 
             p.Price }, 
     Indexes = 
     { 
      { x => x.INFO2, FieldIndexing.Analyzed }, 
      { x => x.CatalogId, FieldIndexing.Default}, 
      { x => x.HasPicture, FieldIndexing.Default}, 
      { x => x.IsOfflineSupplierItem, FieldIndexing.Default}, 
      { x => x.IsRebateItem, FieldIndexing.Default}, 
      { x => x.IsSpecialOrderItem, FieldIndexing.Default}, 
      { x => x.IsSpecialPriceItem, FieldIndexing.Default}, 
      { x => x.IsTieredPricingItem, FieldIndexing.Default}, 
      { x => x.Price, FieldIndexing.Default} 
     } 
    }); 
} 

ナイーブ高度なクエリ

var products = s.Advanced.LuceneQuery<Product>("Products") 
    .WhereEquals("Catalog", "National Catalog") 
    .ToList() 
    ; 
の句

string t1 = "foo"; 
    bool t2 = true; 
    decimal t3 = 100m; 

    products = DocumentSession.Query<Product>() 
     .Statistics(out stats) 
     .Where(p => p.INFO2.StartsWith(t1) && p.IsRebateItem == t2 && p.CatalogId = t3) 
     .OrderByField(columnToSortBy, columnToSortByAsc) 
     .Skip(pageIndex * pageSize) 
     .Take(pageSize) 
     .ToList() 
     ; 

ファーストパス

タイプの最初のチャンス例外「Lucene.Net.QueryParsers.QueryParser.LookaheadSuccess」はLucene.Net.dll タイプ「System.IO.IOException」の最初の機会例外が発生したがで発生した例外をスロー

Lucene.Net.dll

セカンドパス(まだ最速)(作品)

result = s.Advanced.LuceneQuery<Product>("Products_Index") 
.Where("CatalogId:(736275001) AND HasPicture:(true) AND IsOfflineSupplierItem:(false)") 
.ToArray(); 

第3のパス

result = s.Advanced.LuceneQuery<Product>("Products/Index") 
    .Statistics(out stats) 
    .WhereStartsWith("INFO2", "ink") 
    .AndAlso() 
    .WhereStartsWith("INFO2", "pen") 
    .AndAlso() 
    .WhereEquals("CatalogId", 736275001) 
    .AndAlso() 
    .WhereEquals("HasPicture", true) 
    .AndAlso() 
    .WhereEquals("IsOfflineSupplierItem", false) 
    .AndAlso() 
    .WhereEquals("IsRebateItem", false) 
    .AndAlso() 
    .WhereEquals("IsSpecialOrderItem", false) 
    .AndAlso() 
    .WhereEquals("IsSpecialPriceItem", false) 
    .ToArray() 
    ; 
+1

GetIndex == null、PutIndexの場合、インデックスの変更は処理されません。 http://ravendb.net/docs/client-api/querying/static-indexes/defining-static-indexを参照してください – synhershko

答えて

2

これを動的に実行したい場合は、DocumentSession.Advanced.LuceneQueryを使用して、インデックスのプロパティ名として文字列を渡すことができます。 そのようにすれば、強く型付けされた問題に対処する必要はありません。

+0

私の場合、それは完璧に動作します。 –

関連する問題