N + 1selectの問題をHibernate/NHibernateで回避する基本的な方法は知っていますが、適切な解決策を見つけることができない問題の変形に遭遇しました。
次の3つのエンティティがマップされています:アイテム、カテゴリ、顧客。アイテムは多対多でカテゴリに関連付けられ、カテゴリは多対1で顧客にマッピングされます。これまでのところ、特別なことは何もありません。
私のアプリケーションの標準的なクエリは、特定の顧客のすべてのアイテムを取得することです。これは、アイテムのカテゴリプロパティを調べるときにN + 1が選択されないように、アイテムのカテゴリを熱心に取得しようとして、次の基準を使用して行います。
ICriteria criteria = mySession.CreateCriteria(typeof(Item));
.CreateCriteria("Categories", NHibernate.SqlCommand.JoinType.InnerJoin)
.Add(Expression.Eq("Customer", c));
criteria.SetFetchMode("Categories", FetchMode.Eager);
return criteria.List();
ただし、これは機能しません。NHibernateは、後でアイテムごとに1つの選択でカテゴリをフェッチします。
NHibernateは、最初のクエリの結果が(Customerで)フィルタリングされ、クエリによって返されるカテゴリが完全ではない可能性があることを知っているため、後で別のクエリを実行してカテゴリを取得する必要があると私は信じています。 。(この仮定は正しいですか?NHibernateが正しい結果を保証するためにこのように機能しなければならないことは私には合理的であるように思われます。)
ただし、私のビジネスルール(またはあなたがそれらと呼びたいもの)によれば、アイテムは複数の顧客のカテゴリに属することはできないため、実際には、最初のクエリの結果が実際に完了していることがわかります。
私の質問は、NHibernateにこのビジネスルールについて何らかの方法で伝えることができるかということです。このタイプの状況でN+1選択を回避する別の方法はありますか(これはかなり一般的なようです)?