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();
私は何を間違っていますか?
ありがとう