わかりました、私はあなたの構造を反映した自分自身の例を書きましたが、これはうまくいくはずです:
int projectId = 1; // replace that with the id you want
// required for the joins in QueryOver
Project pAlias = null;
Partner paAlias = null;
PartnerCosts pcAlias = null;
Address aAlias = null;
Money mAlias = null;
// Query to load the desired project and nothing else
var projects = repo.Session.QueryOver<Project>(() => pAlias)
.Where(p => p.Id == projectId)
.Future<Project>();
// Query to load the Partners with the Costs (and the Money)
var partners = repo.Session.QueryOver<Partner>(() => paAlias)
.JoinAlias(p => p.Project, () => pAlias)
.Left.JoinAlias(() => paAlias.Costs, () => pcAlias)
.JoinAlias(() => pcAlias.Money, () => mAlias)
.Where(() => pAlias.Id == projectId)
.Future<Partner>();
// Query to load the Partners with the Addresses
var partners2 = repo.Session.QueryOver<Partner>(() => paAlias)
.JoinAlias(o => o.Project, () => pAlias)
.Left.JoinAlias(() => paAlias.Addresses, () => aAlias)
.Where(() => pAlias.Id == projectId)
.Future<Partner>();
// when this is executed, the three queries are executed in one roundtrip
var list = projects.ToList();
Project project = list.FirstOrDefault();
私のクラスは名前が異なっていましたが、まったく同じ構造を反映していました。名前を置き換えました。タイプミスがないことを願っています。
説明:
結合には別名が必要です。Project
必要なをロードする 3 つのクエリを定義Partners
しましCosts
た。. _ _Partners
Addresses
.Futures()
projects.ToList()
これにより、1 回のラウンドトリップで実際に実行される 3 つの SQL ステートメントが生成されます。3 つのステートメントは、次の結果を返します。1) プロジェクトの 1 行 2) パートナーとそのコスト (および金額) の x 行 (x はプロジェクトのパートナーのコストの合計数) 3) プロジェクトのパートナーの y 行パートナーとその住所。ここで、y はプロジェクトのパートナーの住所の総数です。
あなたのデータベースは、デカルト積である x*y 行ではなく、1+x+y 行を返す必要があります。あなたのDBが実際にその機能をサポートしていることを願っています。