Хорошо, я написал для себя пример, отражающий вашу структуру, и это должно сработать:
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
, который вы хотите, Partners
с их Costs
и Partners
с их Addresses
. Используя .Futures()
, я в основном говорю NHibernate, чтобы они выполнялись за один прием в тот момент, когда я действительно хочу получить результаты, используя projects.ToList()
.
Это приведет к трем операторам SQL, которые действительно выполняются за один прием. Три утверждения вернут следующие результаты:
1) 1 строка с вашим проектом
2) х строк с партнерами и их затратами (и деньгами), где х - общее количество затрат для партнеров проекта
3) y строк с партнерами и их адресами, где y - общее количество адресов для партнеров проекта
Ваша БД должна возвращать 1 + x + y строк вместо x * y строк, которые были бы декартовым произведением. Я очень надеюсь, что ваша БД действительно поддерживает эту функцию.