Frage

Wir verwenden eine Datenbank, die keine Abfragebatching unterstützt, sodass wir in diesem Fall keine NHibernate -Futures verwenden können. Wir wissen, dass wir unser komplexes Objektdiagramm immer noch mit mehreren Querien (um kartesische Produkte zu vermeiden) zu füllen, benötigen jedoch Ratschläge, wenn ich den Ansatz neu aufstellen kann.

Bitte beachten Sie hier> Einzelentwickler hier, um Rat zu suchen.

Hier ist ein Beispielcode, der den aktuellen Ansatz veranschaulicht.

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

Aus dem obigen Code sehen Sie, dass ich drei separate Abfragen verwende, um eine Liste von Obstbaskets zu füllen. Dieser Ansatz funktioniert, aber ich vermute, dass es einen besseren Weg gibt, sich allen Kindern in das übergeordnete Objekt zu verbinden, ohne jedes Mal vom Wurzelobjekt abfragen zu müssen.

Gibt es einen Ansatz, den ich verwenden kann, der es mir ermöglicht, die Bedingung auf das übergeordnete Objekt anzuwenden und die Ergebnisse dieser Abfrage zu verwenden, um alle Kinderobjekte automatisch zu erhalten? Bitte beachten Sie, dass Kinder 3 Ebenen tief gehen können, dh fruitBasket.yoghurt.flavour.besitzer.

Jeder Rat wird geschätzt.

C# .NET 4, NhiNRNATE 3.0

War es hilfreich?

Lösung

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

konnte es aber nicht testen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top