私はこのスキーマを持っています:
私はすでにManyToManyの間のマッピングを行っています Post
そして Tag
。私が達成しようとしているのは、投稿のリストと各投稿のタグの子コレクションです。このように表示することができます:
私がこれまでにしたことはこれです:
IList<Post> results = base._session.CreateCriteria(typeof(Post))
.SetFetchMode("User", FetchMode.Eager)
.SetFetchMode("Votes", FetchMode.Eager)
.AddOrder(Order.Desc("_dateCreated"))
.ToList();
しかし、すべての Post
それは1つの余分なSQLをフェッチする Votes
。 一度にそれを取得する方法はありますか?
回答:
回答№1は1この場合の解決策はバッチフェッチである必要があります。ここに: 19.1.5。バッチフェッチを使用する 詳細を見つけることができます。
あなたはあなたのコレクションやエンティティに属性を付ける必要があります batch-szie="25"
.
xml:
<bag name="Tags" ... batch-size="25">
...
流暢:
HasManyToMany(x => x.Tags)
...
.BatchSize(25)
これは、1つだけでなく、ほとんどのSQL Selectステートメントを実行しますが、得られる柔軟性は重要です。
ここではバッチフェッチが正しい方法である理由を説明しようとしました。 NHibernate QueryOverでFetchを実行すると複数のSQLクエリとDBヒットが発生する
最後に、簡単なクエリを使用できます (明示的なフェッチではない)、なぜなら、 batch-size
必要なすべての遅延ロードを取得するために発行されるSQL文の量を削減します...