私のウェブページにはいくつかのドロップダウンがあります。これらはリンクされており、双方向リンクで同様のクラス構造を持っています。nhibernate3 query - コレクションを含むコレクション
つまり、クラスAlphaには、クラスBetaのリストがあり、これにはチャーリークラスのリストがあります。各クラスのベータ版にはアルファ(それが属するもの)の独自のリストがあり、各クラスのチャーリーには独自のベータリストがあります。
私は、流暢なnhibernateとautomappingsでNHibernate 3を使用しています。
今すぐ。私が単純に実行する場合
session.CreateCriteria<Alpha>().SetMaxResults(1000).List<Alpha>();
私はコレクションをループするときにN + 1の問題が発生します。
私はそれ以下のSQLの参照方法は、すべてのことがデータベース
select top 1000 * from Alpha
select top 1000 * from Beta
select top 1000 * from Charlie
select * from Alpha2Beta
select * from Beta2Charlie
しかし、どのようにこれが機能するために、私は、クエリを記述しないために照会する必要があります?
アルファとベータ、ベータとチャーリーの間に双方向の関係があります。どのようにこれらの3つのテーブルのみをクエリできますか?これを達成するためのテーブルをリンクする必要があります... –
ああ愚かな私、あなたは絶対に正しいです!テキストを更新します – Ivar
ステートレスセッションを使用しているようです。 StatelessSessionにはキャッシュがありません。ステートレスセッションのオブジェクトは遅延ロードできません。つまり、コンポーネントをプリフェッチして合成クエリを実行することはできません。この場合、クエリで.Fetch()を使用して、Alpha2BetaとBeta2Charlieのサブオブジェクトを熱心に読み込む必要があります。まだいくつかの重複がありますが、N + 1ほど悪くはありません。 – Origin