Question

Nous utilisons une base de données qui ne prend pas en charge la requête afin que nous batching ne pouvons pas utiliser à terme NHibernate dans ce cas. Nous savons que nous pouvons encore remplir notre objet graphique complexe en utilisant plusieurs-requêtes (pour éviter les produits cartésiens) mais qui ont besoin des conseils si je peux factoriser l'approche.

S'il vous plaît note> développeur unique ici, donc demander des conseils.

Voici quelques exemples de code qui illustre l'approche actuelle;

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();

Vous pouvez voir dans le code ci-dessus que j'utilise trois requêtes distinctes pour remplir une liste de Corbeille cadeau. Cette approche fonctionne mais je suppose qu'il ya une meilleure façon de rejoindre tous les enfants dans l'objet parent sans avoir à la requête de l'objet racine à chaque fois.

Y at-il une approche que je peux utiliser ce qui me permettra d'appliquer la condition where à l'objet parent et d'utiliser les résultats de cette requête pour obtenir automatiquement tous les objets enfants. S'il vous plaît noter que les enfants peuvent aller 3 niveaux de profondeur, à savoir FruitBasket.Yoghurt.Flavour.Owners.

Un conseil est apprécié.

C # .NET 4, NHibernate 3.0

Était-ce utile?

La solution

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();

n'a pas pu le tester si

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top