そうですね、将来のクエリと DistinctRootEntityResultTransformer が必要だと思います
Criteria を使用してどのように行うかをお見せし、同じことをお勧めします。私たちのプロジェクトではすべてが LINQ ですが、これは醜く、魔法の文字列を使用する必要がありました。これは、多数のメンバーと多数のサブグループを持つグループ オブジェクトです。クエリを実行した後、LOADED オブジェクトを保持するルート (ルートは親が null の要素) を取得します。あなたの場合、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);
}