2012-07-12 62 views
4

我有一個使用文檔的應用程序,它包含字典中的屬性列表,出於某種原因,我們需要使用靜態索引並對這些屬性使用查詢/篩選。字典上的RavenDB靜態索引

原型是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IDocumentStore store = new DocumentStore() { DefaultDatabase = "Test", Url = "http://localhost:8081" }; 
     store.Initialize(); 

     IndexCreation.CreateIndexes(typeof(Program).Assembly, store); 

     using (var session = store.OpenSession()) 
     { 
      session.Store(new Document { Id = "1", Name = "doc_name", Attributes = new Dictionary<string, object> { { "Type", "1" }, { "Status", "Active" } } }); 
      session.SaveChanges(); 
     } 

     using (var session = store.OpenSession()) 
     { 
      // works 
      var l1 = session.Query<Document, Documents_Index>().Where(a => a.Attributes["Type"] == "1").ToList(); 
      // not working 
      var l2 = session.Query<Document, Documents_Index>().Where(a => a.Attributes["Status"] == "Active").ToList(); 
     } 
    } 
} 

public class Documents_Index : AbstractIndexCreationTask<Document> 
{ 
    public Documents_Index() 
    { 
     Map = docs => docs.Select(a => 
     new 
     { 
      a.Name, 
      a.Attributes, 
      Attributes_Type = a.Attributes["Type"] 
     }); 
    } 
} 

[Serializable] 
public class Document 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public Dictionary<string, object> Attributes { get; set; } 
} 

但因爲我需要使用任意的屬性名稱/值查詢這個指數並解決我們的問題。實際上,屬性列表在運行時是已知的(所以我們嘗試修改Map表達式以注入任意數量的屬性名稱,但迄今爲止我們不成功)。有沒有辦法以某種動態的方式定義索引?

回答

6

你需要寫它喜歡:

public class Documents_Index : AbstractIndexCreationTask<Document> 
{ 
    public Documents_Index() 
    { 
     Map = docs => docs.Select(a => 
     new 
     { 
      a.Name, 
      _ = a.Attributes.Select(x=>CreateField("Attributes_"+x.Key, x.Value), 
     }); 
    } 
} 
+0

作品像預期,但實現了「_」屬性名稱是非常重要的,而不是改變 – puco 2012-07-13 09:19:30