Мы используем базу данных, которая не поддерживает пакетную обработку запросов, поэтому в данном случае мы не можем использовать NHibernate Futures. Мы знаем, что по-прежнему можем заполнять наш сложный граф объектов, используя множественные запросы (чтобы избежать декартовых произведений), но нам нужен совет, если я смогу реорганизовать подход.
Обратите внимание > Единственный разработчик здесь, поэтому прошу совета.
Вот пример кода, иллюстрирующий текущий подход;
var fruitBasketAlias = new Store.FruitBasket();
var yoghurtAlias = new Store.Yoghurt();
var flavourAlias = new Store.Flavour();
var ownersAlias = new Store.Owner();
var FruitBaskets = session.QueryOver(() => fruitBasketAlias)
.Where(() => fruitBasketAlias.Owner.ID == OwnerID
&& fruitBasketAlias.ExpiryDate <= dateTO
&& fruitBasketAlias.ExpiryDate >= dateFROM)
.Fetch(x => x.BasketLiner).Eager
.List();
session.QueryOver(() => fruitBasketAlias)
.Select(x => x.Yoghurts)
.Where(() => fruitBasketAlias.Owner.ID == OwnerID
&& fruitBasketAlias.ExpiryDate <= dateTO
&& fruitBasketAlias.ExpiryDate >= dateFROM)
.JoinAlias(() => fruitBasketAlias.Yoghurts, () => yoghurtAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => yoghurtAlias.Flavour, () => flavourAlias, JoinType.InnerJoin)
.List();
session.QueryOver(() => fruitBasketAlias)
.Where(() => fruitBasketAlias.Owner.ID == OwnerID
&& fruitBasketAlias.ExpiryDate <= dateTO
&& fruitBasketAlias.ExpiryDate >= dateFROM)
.JoinAlias(() => fruitBasketAlias.Yoghurt, () => yoghurtAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => yoghurtAlias.Flavour, () => flavourAlias, JoinType.InnerJoin)
.JoinAlias(() => flavourAlias.Owners, () => ownersAlias, JoinType.LeftOuterJoin)
.List();
Из приведенного выше кода видно, что я использую три отдельных запроса для заполнения списка FruitBaskets. Этот подход работает, но я подозреваю, что есть лучший способ объединить все дочерние элементы с родительским объектом без необходимости каждый раз запрашивать корневой объект.
Есть ли подход, который я могу использовать, который позволит мне применить условие where к родительскому объекту и использовать результаты этого запроса для автоматического получения всех дочерних объектов. Обратите внимание, что дети могут пройти 3 уровня в глубину, то есть Корзинка с фруктами.Йогурт.Вкус.Владельцы.
Любые советы приветствуются.
С# .NET 4, NHibernate 3.0