NHibernate, отдельные запросы (используя QueryOver) для заполнения сложного объекта

Мы используем базу данных, которая не поддерживает пакетную обработку запросов, поэтому в данном случае мы не можем использовать 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


person paligap    schedule 05.12.2011    source источник


Ответы (1)


var FruitBaskets = session.QueryOver<FuitBasket>()
    .Where(b => b.Owner.ID == OwnerID
                    && b.ExpiryDate <= dateTO
                    && b.ExpiryDate >= dateFROM)
    .Fetch(x => x.BasketLiner).Eager
    .JoinAlias(b => b.Yoghurts, () => yoghurtAlias, JoinType.LeftOuterJoin)
    .List();

var yoghurts = session.QueryOver<Store.Yoghurt>()
    .WhereRestrictionOn(y => y.Id).In(FruitBaskets.SelectMany(b => b.Yoghurts).Select(y = > y.Id).Distinct())
    .JoinAlias(y => y.Flavour, () => flavourAlias, JoinType.InnerJoin)
    .List();

session.QueryOver<Store.Flavor>()
    .WhereRestrictionOn(f => f.Id).In(yoghurts.SelectMany(y => y.Flavors).Select(b = > f.Id).Distinct())
    .JoinAlias(f => f.Owners, () => ownersAlias, JoinType.LeftOuterJoin)
    .List();

хотя проверить не смог

person Firo    schedule 05.12.2011
comment
Спасибо, Фиро, я изучаю ваш подход и использование WhereRestrictionOn, потому что чувствую, что вы движетесь в правильном направлении. Приведенный выше код не работает с ошибкой не может определить элемент для y. - person paligap; 06.12.2011
comment
@paligap сделал это сравнением идентификаторов - person Firo; 06.12.2011
comment
Спасибо, Фиро... Я смог внести несколько изменений, и в результате получился гораздо более чистый SQL, который заполняет граф объектов. Переход на сравнение идентификаторов был ключевым, спасибо, что указали мне правильное направление. - person paligap; 07.12.2011