2012-06-06 127 views
1

如果我已保存的文件看起来是这样的:在RavenDB中,如何查询文档中的嵌套“对象”?

Category { 
    public string Id {get;set;} 
    public List<Category> Categories {get;set;} 
    ... 
} 

基本上是一个类别,与子类别。在我的情况下,只有深度2级(1个父级,n个子类别)。

查询所有类别的效果很好,显示一个不错的列表(也有嵌套的子类别列表)。我的用户只能点击一个子类别,查看选定类别中的内容。我想抽出1个子类别,作为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)。

+0

请说明:您是否想获得给定子类别标识的类别? –

回答

2

您的类别属性包含对象列表,而您可以拥有嵌套类别的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); 

一个警告:我没有测试此代码,因为我没有一个项目来测试它的权利,但这里有我的消息来源:

  1. http://ayende.com/blog/4584/ravendb-includes
  2. RavenDB Include - Session.Load<T>(string[] ids)
  3. http://richarddingwall.name/2012/03/08/ravendb-includes-much-simpler-than-you-think/
+0

我花了一段时间来琢磨你在说什么......但我认为你想说的是,子类别没有id,因为RavenDB不会自动创建嵌套的文档ID。 在我的情况下,身份证都是手动分配的ID,并且所有的子分类都有ID。 对不起,我不认为在我的问题中有这个问题,我会添加它。谢谢。 – Chaddeus

+2

嗯,没有那么多,他们没有身份证,但他们不是文件。 Raven不会从父类别中独立地了解它们。当您从Raven请求数据时,您要么请求文档(通过标识或查询),要么请求减少结果(通过减少索引。)获得您要查找的数据的唯一方法是创建所有类别文档,创建您自己的Reduce索引(这可能对您的嵌套很困难),或者完全按照您的操作进行(将父文档和其余的LINQing。) –