2013-05-14 71 views
0

考慮下列實體:QueryOver返回滿樹層次

public class Comment 
{ 
    public int Id { get; set; } 
    public IList<Comment> ChildComments { get; set; } 
} 

我基本上要加載完整的樹,即其子女加子女等利用QueryOver爲給定ID的註釋。不幸的是,我真的不知道從哪裏開始。

映射設置爲急於負載集合心不是一個選項,我滿意。

有沒有辦法做到這一點很容易或者我需要在這種情況下使用HQL?

謝謝。

+0

Urmmmm。 'Session.QueryOver ().ToList()'???這將加載整個表格。 – Rippo 2013-05-14 17:49:48

+0

@Rippo對不起我不是清楚前面,所以我有一個評論的ID,並希望與孩子的滿樹一起加載此評論評論一路下跌 – marky 2013-05-14 20:19:16

回答

1

好吧,我想你需要將來的查詢和DistinctRootEntityResultTransformer

我可以告訴你我是如何與標準做到這一點,也建議你做同樣的。在我們的項目中,所有的東西都是LINQ,但是這個必須是醜陋的,並且帶有魔術字符串。這是具有許多成員和許多子小組的組對象。在執行查詢之後,我得到了根(根是parent爲空的元素),其中保存了LOADED對象。對於您的情況,您應該添加CommendId的限制。另外,每個提取都必須在單獨的未來查詢中完成。祝你好運

public static GroupDto GetGroupHierarchy(this ISession session) 
    { 
     session 
      .CreateCriteria<GroupDto>() 
      .Add(Expression.Eq("IsActive", true)) 
      .SetFetchMode("Subgroups", NHibernate.FetchMode.Eager) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<GroupDto>(); 

     var groups = session 
       .CreateCriteria<GroupDto>() 
       .Add(Expression.Eq("IsActive", true)) 
        .SetFetchMode("Members", FetchMode.Eager) 
        .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
        .Future<GroupDto>(); 

     return groups.Single(g => g.Parent == null); 
    } 
+0

感謝@mynkow但我的意見樹爲n層深。如果事先知道關卡的話,那麼你的解決方案將是完美的。 – marky 2013-05-15 10:03:08

+0

不可以,這個適用於N級 – mynkow 2013-05-15 12:48:08

+0

你是對的,它的完美與n級的深度。謝謝@mynkow! – marky 2013-05-15 21:54:46