在RavenDB中,如何查询文档中的嵌套“对象”
本文关键字:文档 嵌套 对象 RavenDB 何查询 查询 | 更新日期: 2023-09-27 18:36:20
如果我存储的文档看起来像这样:
Category {
public string Id {get;set;}
public List<Category> Categories {get;set;}
...
}
本质上是一个类别,带有子类别。就我而言,只有 2 个级别深(1 个父级,n 个子类别)。
查询所有类别效果很好,显示一个不错的列表(也有嵌套的子类别列表)。我的用户只能单击子类别以查看所选类别中的内容。我想从Category
中提取出其中一个子类别.
给定一个子类别 ID,我将如何提取其中一个子类别作为它自己的独立Category
?
更新
我想补充一点,我正在通过这样做来解决这个问题:
Category pCat = RavenSession.Query<Category>().Where(x => x.Categories.Any(c => c.Id == id)).FirstOrDefault();
Category cat = pCat.Categories.Where(x => x.Id == id).FirstOrDefault();
它首先获取包含子类别的类别,然后查询该类别上的子类别以拉取特定的子类别。
也许这样更好,我不知道...但似乎它正在做 2 个步骤,而 1 个就足够了。
更新 2
这些类别中的所有 id 都是手动添加的,没有 RavenDB 自动 ID(即使是子类别也有 ID)。
您的 Categories(类别)属性包含对象列表,您可以在其中拥有嵌套类别的 ID。 子类别,即您构建它的方式,将没有 ID,只有数据。
Category {
public string Id {get;set;}
public List<Category> Categories {get;set;}
...
}
相反,请尝试此模型和此查询:
Category {
public string Id {get;set;}
public List<string> CategoryIDs {get;set;}
...
}
var parent = session
.Include(i => i.CategoryIDs)
.Load<Category>("category/1");
var children= session.Load<Category>(parent.CategoryIDs);
警告:我还没有测试过这段代码,因为我现在没有项目来测试它,但这是我的来源:
- http://ayende.com/blog/4584/ravendb-includes
- RavenDB Include - Session.Load
(string[] ids) - http://richarddingwall.name/2012/03/08/ravendb-includes-much-simpler-than-you-think/