2012-08-08 90 views
1

我在RavenDB的單個文檔中保存了一個類別層次結構。查詢RavenDB中的層次結構

"CategoryList": [ 
{ 
    "$id": "1", 
    "Id": "Admin", 
    "Name": "Administration", 
    "ParentCategory": null, 
    "Subcategories": [ 
    { 
     "$id": "2", 
     "Id": "Admin1", 
     "Name": "Administration 1", 
     "ParentCategory": { 
     "$ref": "1" 
     }, 
     "Subcategories": [] 
    },... 

我可以成功地在C#中使用這兩個類

public class Categories 
{ 
    public string Id { get; set; } 
    public IEnumerable<Category> CategoryList{ get; set; } 
} 

[JsonObject(IsReference = true)] 
public class Category 
{ 
    private readonly IList<Category> _subcategories; 

    public string Id { get; set; } 
    public string Name { get; set; } 
    public Category ParentCategory { get; set; } 

    public IEnumerable<Category> Subcategories 
    { 
     get { return _subcategories; } 
    } 

    public Category() 
    { 
     _subcategories = new List<Category>(); 
    } 

    public void AddSubcategory(Category subcategory) 
    { 
     subcategory.ParentCategory = this; 
     _subcategories.Add(subcategory); 
    } 
} 

加載但現在我想查詢我的類別層次結構來獲取其ID的單一類別。我怎麼能這樣做?爲每個類別創建一個文檔會更好嗎?

感謝

UPDATE:

嗨,Ayende,

感謝您的答覆。我相信,在你的文章正在使用Hierarchy方法的方式已經過時了,但我還是能找到新的版本...

閱讀本article後,我創建了一個索引返回所有類別:

public class CategoriesByIdIndex : AbstractIndexCreationTask<Categories, CategoriesByIdIndex.ReduceResult> 
{ 
    public class ReduceResult 
    { 
     public string Id { get; set; } 
     public Category Category { get; set; } 
    } 

    public CategoriesByIdIndex() 
    { 
     Map = categoriesCollection => from categories in categoriesCollection 
             from category in categories.CategoryList 
             from subcategory in category.Hierarchy(x => x.Subcategories) 
             select new 
               { 
                subcategory.Id, 
                Category = subcategory 
               }; 

     Store(x => x.Id, FieldStorage.Yes); 
     Store(x => x.Category, FieldStorage.Yes); 
    } 
} 

當我做這個查詢,所有類別返回:

var allCategories = session.Query<Categories, CategoriesByIdIndex>() 
      .AsProjection<CategoriesByIdIndex.ReduceResult>() 
      .ToList(); 

但是當我試圖通過一個類別編號進行篩選,我收到一個空列表:

var singleCategory = session.Query<Categories, CategoriesByIdIndex>() 
      .AsProjection<CategoriesByIdIndex.ReduceResult>() 
      .Where(x => x.Id == "Admin1") 
      .ToList(); 

我在做什麼錯?

感謝

回答