2012-01-23 5 views
0

NHibernateを使用して特定のタイプのすべてのエンティティのすべての子コレクションを熱心に取得する方法が必要です。すべての子コレクションを熱心に取り出す方法は?

私が試した:

var myObjectList = SessionHolder.Current 
    .CreateCriteria(typeof(MyObject)) 
    .SetFetchMode("Clients", FetchMode.Eager) 
    .SetFetchMode("Locations", FetchMode.Eager) 
    .SetFetchMode("Contracts", FetchMode.Eager) 
    .List<MyObject>(); 

をクエリが熱心にロードされた彼らのコレクションをDBからすべてのMyObjectにインスタンスを返していたはずですが、意図したとおり、それは動作しませんでした、代わりにそれは予想以上のオブジェクトが返されます。私はそれがn + 1が問題を選択するのと関係があると仮定します。

コレクションを取得するのにthis solutionが見つかりましたが、現在はNHibernate 1.2.1.4000に限定されていますので、先物は使用できません。

私は投稿する前に多くの研究をしましたが、何も見つかりませんでした。

あなたの返信ありがとうございます!

答えて

1

は明確な結果変圧器を使用してみてください:

var myObjectList = 
    SessionHolder.Current 
       .CreateCriteria(typeof(MyObject)) 
       .SetFetchMode("Clients", FetchMode.Eager) 
       .SetFetchMode("Locations", FetchMode.Eager) 
       .SetFetchMode("Contracts", FetchMode.Eager) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .List<MyObject>(); 
+0

私は今ではMyObjectにエンティティの正しい数を返し、それをテストしたが、子どもたちが複製返され、例えば、MyObjectにの1つのインスタンスのために私が返さを持っているかもしれませんクライアントのリスト:Client1、Client1、Client1、Client2、Client2、Client2。それはなぜ起こるのでしょうか? –

+0

HQLを使って試してみてください。 "SessionHolder.Current.CreateQuery(" MyObjectからのoのようなものは、左の結合フェッチo.Clientsが結合フェッチo.Locationsを残したままにします。) "、SetResultTransformer(新しいDistinctRootEntityResultTransformer())リスト()' –

+0

、私はそれを試してみます –

関連する問題