2012-06-06 61 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。) –