2012-06-06 2 views
1

Если я хранятся документы, которые выглядят так:В RavenDB, как запросить вложенные «объекты» в документе?

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

По существу категория, с подкатегорий. В моем случае, только 2 уровня глубины (1 родительский, n подкатегорий).

Querying for all categories отлично работает, показывая хороший список (с вложенными списками подкатегорий). Мои пользователи могут выбирать только подкатегорию, чтобы просматривать объекты в выбранной категории. Я хочу вытащить 1 из подкатегорий, как Category.

Учитывая идентификатор подкатегории, как бы я вытащил одну из подкатегорий из своего автономного Category?

Update

Я хотел бы добавить, я получаю вокруг этого, делая это:

 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 может хватить.

Update 2

Все идентификаторы в этих категориях добавляются вручную, без каких-либо RavenDB Auto ID (даже суб-категории имеют Id).

+0

Просьба уточнить: вы хотите получить Категорию с идентификатором подкатегории? –

ответ

2

Категории Свойство содержит список объектов, где вместо этого вы можете иметь идентификаторы вложенных категорий. Типы детей, как вы его построили, не будут иметь идентификаторы, а только данные.

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

Мне потребовалось некоторое время, чтобы понять, что вы говорите ... но я думаю, что вы пытаетесь сказать, что подкатегории не будут иметь идентификаторов, потому что RavenDB не будет автоматически создавать вложенные идентификаторы документов. В моем случае идентификаторы всех идентификаторов вручную назначаются, и все подкатегории имеют идентификаторы. Извините, я не думал, что в моем вопросе, я добавлю. Благодарю. – Chaddeus

+2

Ну, это не так, что у них нет идентификаторов, но они не являются документами. Ворон не знает о них независимо от родительской категории. Когда вы запрашиваете данные из Raven, вы либо запрашиваете документ (по ID или запросу), либо сокращаете результат (путем уменьшения индекса.) Единственный способ получить данные, которые вы ищете, - это сделать все документы категорий, создать свой собственный индекс сокращения (который может быть затруднен для вашей вложенности) или делать то, что вы делаете (вытягивание родительского документа и LINQing для остальных.) –