Well, I think you need future queries and DistinctRootEntityResultTransformer
I can show you how I do it with Criteria and also recommend you to do the same. In our project everything is LINQ but this one had to be ugly and with magic strings. This is Group object with Many Members and Many SubGroups. After executing the query I get the root (the root is the element which parent is null) which hold LOADED objects in it. For your case you should add a restriction by CommendId Also, each fetch have to be done in a separate future query. Good luck
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);
}