鉴于以下实体:
public class Comment
{
public int Id { get; set; }
public IList<Comment> ChildComments { get; set; }
}
我基本上想要加载完整的树,即带有子项及其子项的注释等等,使用QueryOver获取给定的Id。不幸的是,我真的不知道从哪里开始。
将映射设置为急切加载集合不是我的选择。
有没有办法轻松地做到这一点,还是我需要在这种情况下使用hql?
感谢。
答案 0 :(得分:1)
好吧,我认为你需要将来的查询和DistinctRootEntityResultTransformer
我可以告诉你我是如何使用Criteria做的,并建议你也这样做。在我们的项目中,一切都是LINQ,但这个必须是丑陋的,并带有魔法字符串。这是具有许多成员和许多子组的Group对象。执行查询后,我获得了根(root是父元素为null的元素),其中包含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);
}