2010-09-09 82 views
1

我需要幫助從取樹層次數據庫使用NHibernate 3.0NHibernate的取整棵樹

QueryOver.Of<Enterprise>(() => entAlias) 
    .JoinAlias(() => entAlias.ChildEntities,() => childEntityAllias, JoinType.LeftOuterJoin) 
    .TransformUsing(new DistinctRootEntityResultTransformer()) 

我只獲得兩個層的圖表(母公司及其子女),但沒有子女等

的兒童

同樣,如果我試圖取父母的葉子。我只得到葉子的父親,但不是葉子的父親的父親。 level = n。

Ho做這種類型的查詢。沒有mather如果Icriteria,LINQ,HQL或其他。

+0

你能展示你的類和映射文件嗎?您的樹層次結構在每個級別上是不同的類型,還是ChildEntities也是Enterprise對象? – 2010-12-01 20:51:52

回答

1

您可以使用批量大小更有效地獲取孩子。

<bag name="Childen" batch-size="20" ...> 

孩子仍然由單獨的查詢加載(你不應該在查詢中加入他們了),但始終保持在20一次。將「N + 1」變成通常表現非常好的「N/20 + 1」。這個解決方案的優點是你不需要關心你的查詢。

您也可以加載在批父母:

<class name="Enterprise" batch-size="20"> 

它加載多到一個關係到企業分批如果可能的話。

如果您需要更多優化,請考慮添加對根的引用(最上面的父項)。然後你可以在一個簡單的查詢中加載一個根的所有孩子。缺點是你需要關心這個參考,這是一個冗餘,也很難維護。

+0

謝謝,我認爲這是現在最好的答案。唯一的問題是我正在使用遺留數據庫,它使用Identity作爲主鍵,因此批處理被禁用,無法使用。 – Luka 2010-12-06 09:17:01

+0

這是批量提取(不是批量插入和更新)。它應該總是可能的,它不依賴於使用的id生成器的種類。 – 2010-12-06 10:06:42

0

如果你真的想要獲取所有東西(儘管我不確定你爲什麼要這樣做),那麼在NHibernate中禁用延遲加載(從而啓用加載)。