2012-04-04 5 views
0

Diese Frage beruht auf der folgenden Frage (n)Wie erstelle ich meine RavenDb Where-Klausel für dieses Dokument angesichts dieser Anforderungen?

Indexing: How do I construct my RavenDb static indexes for this document, given these requirements?

Einfache Where-Klausel mit Paging: How to construct a proper WHERE clause with RavenDb

Das Wesen der Frage ist, wie ich hinzufügen oder entfernen Felder dynamisch teilnehmen in einer where-Klausel?

Dokument:

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

} 

Index:

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

Naive Where-Klausel

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() 
     ; 

First Pass bei Advanced Query

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

die eine Ausnahme

Eine erste Möglichkeit Ausnahme des Typs ‚Lucene.Net.QueryParsers.QueryParser.LookaheadSuccess‘ aufgetreten in Lucene.Net.dll eine erste Chance Ausnahme des Typs ‚System.IO.IOException‘ aufgetreten wirft Lucene.Net.dll

Zweiter Durchgang (Werke)

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

Third Pass (und schnellste noch)

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

Tun Sie nicht, wenn GetIndex = null, dann PutIndex - es wird nicht mit Indexänderungen umgehen. Siehe http://ravendb.net/docs/client-api/querying/static-indexes/defining-static-index – synhershko

Antwort

2

Wenn Sie dies dynamisch durchführen möchten, können Sie die Datei DocumentSession.Advanced.LuceneQuery verwenden, mit der Sie Zeichenfolgen als Eigenschaftsnamen für den Index übergeben können. Auf diese Weise müssen Sie sich nicht mit den stark typisierten Problemen befassen.

+0

Für meinen Fall ist es perfekt. –

Verwandte Themen