1

私は、効率について何も考えずにNHibernateが使用されているレガシーアプリケーションに取り組んでいます。私は現在、これまでに200を超えるクエリが実行された方法をステップスルーしています。これは主にN+1の問題が原因です。

とにかく、これを修正することを考えると、私の質問は次のとおりです。

たとえば、10個の子コレクションを持つエンティティがあり、そのほとんどすべてが1回の操作でアクセスされる場合、NHibernateで個々の子レコードを遅延ロードするのではなく、1回の呼び出しで各子コレクションを遅延ロードする方法があります。アクセスされます(たとえば、現在起こっていることであるforeachループで)。これらすべての子コレクションを一度に積極的に読み込むことは、大規模なクエリであり、パフォーマンスはそれほど高くないように思われます。しかし、明らかにこのN+1アプローチは間違っています。子コレクション全体をオンデマンドでロードするクエリを実行するようにNHibernateに指示するにはどうすればよいですか?これでも11個のクエリが得られますが、200個よりも優れており、すべてを熱心にロードした場合に実行する必要のある大規模なクエリよりも優れている可能性があります。

ありがとう!

4

1 に答える 1

2

メソッドNHibernateUtil.Initialize(yourObject.ChildCollection)を使用できます。このメソッドは、マッピングで設定したフェッチ戦略に基づいてプロキシにデータをロードさせます。出典:NHibernateドキュメント

于 2012-05-16T16:06:48.300 に答える