1

RavenDB の 1 つのドキュメントにカテゴリ階層を保存しました。

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

これら2つのクラスを使用して、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 で単一のカテゴリを取得したいと考えています。どうすればそれができますか?カテゴリごとに 1 つのドキュメントを作成した方がよいでしょうか?

ありがとう

アップデート:

こんにちは、アイエンデさん。

返信いただきありがとうございます。あなたの記事でメソッドが使用されているHierarchy方法は時代遅れだと思いますが、新しいバージョンを見つけることができました...

この記事を読んだ後、すべてのカテゴリを返すインデックスを作成しました。

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

しかし、カテゴリ ID でフィルタリングしようとすると、空のリストが表示されます。

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

私は何を間違っていますか?

ありがとう

4

0 に答える 0