マッピングで abatch-size
を指定します。Category.ChildCategories
これにより、NHibernate は一度に 1 つずつではなく、指定されたサイズのバッチで子を取得します (これにより、N+1 問題が軽減されます)。
ファイルを使用している場合は、次のよう.hbm
に指定できます。batch-size
<bag name="ChildCategories" batch-size="30">
または流暢なマッピングを使用する
HasMany(x => x.ChildCategories).KeyColumn("ParentId").BatchSize(30);
詳細については、NHibernate のドキュメントを参照してください。
編集
わかりました、私はあなたの要件を理解していると思います. 次の構成で
HasManyToMany<Item>(x => x.ChildCategories)
.Table("CategoryLink")
.ParentKeyColumn("ParentId")
.ChildKeyColumn("CategoryID")
.BatchSize(100)
.Not.LazyLoad()
.Fetch.Join();
次の行を使用して、1 回の呼び出しで階層全体を取得できるはずです。
var result = session.CreateCriteria(typeof(Category)).List();
何らかの理由で、このような単一のカテゴリを取得する
var categoryId = 1;
var result = session.Get<Category>(categoryId);
階層内のレベルごとに 1 つの呼び出しが発生します。これでもデータベースへの呼び出し回数は大幅に減ると思いますが、データベースへの 1 回の呼び出しで上記の例を動作させることはできませんでした。