0

次のエンティティがあるとします。

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

私は基本的にツリー全体、つまりコメントとその子とその子などを、特定の Id に対して QueryOver を使用してロードしたいと考えています。残念ながら、どこから始めればよいのか本当にわかりません。

コレクションを熱心にロードするようにマッピングを設定することも、私にとってはオプションではありません。

これを簡単に行う方法はありますか、この場合 hql を使用する必要がありますか?

ありがとう。

4

1 に答える 1

1

そうですね、将来のクエリと 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);
    }
于 2013-05-14T23:06:18.927 に答える