2012-08-08 99 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(); 

我在做什么错?

感谢

回答