4 Stimmen

nHibernate - Eager Fetching einer Liste mit bereits ausgefüllten untergeordneten Listen

Ich habe einige Objekte:

Public Class Person() {
    public int Id {get;set;}
    public IList<Account> Accounts {get;set;}
    public string Email {get; set;}
}

public class Account(){
    public int Id {get;set;}
    public IList<AccountPayment> Payments {get;set;}
    public IList<Venue> Venues {get;set;}
}

public class AccountPayment(){
    public int Id {get;set;}
    public DateTime PaymentDate {get;set;}
    public decimal PaymentAmount {get;set;}
}

public class Venue(){
    public int Id {get;set;}
    public string AddressLine1 {get;set;}
    public string Postcode {get;set;}
}

Diese Klassen werden mit nHibernate auf MS Sql abgebildet - es gibt eine Tabelle in der Datenbank pro Klasse...

Ich möchte eine Methode in meinem Repository erstellen, GetAccounts(int PersonID), die eine Liste mit allen untergeordneten Sammlungen des Kontos auf die effizienteste Weise zurückgibt. Kann mir jemand einen Tipp geben, wie ich das machen kann - ich möchte die Listen nicht wirklich als Subselects in meinen Mappings einrichten, wenn ich es vermeiden kann...

Gracias.

1voto

LordHits Punkte 4994

Wenn Sie Ihre Klassen auf die von Ihnen erwähnte Weise den Tabellen zugeordnet haben, warum rufen Sie dann nicht einfach das Person-Objekt auf, um alle Konten zu erhalten? Wenn Sie das Person-Objekt aus Ihrem Repository aufrufen, können Sie eifrig Konten laden. Zum Beispiel so:

 public Person GetById(int id)
    {
        using (var tx = _sessionBuilder.GetSession().BeginTransaction())
        {
            // -- Lazy load way --
            //Person person = _sessionBuilder.GetSession().Get<Person>(id);
            //tx.Commit();
            //return person;

            // -- Eager load way --                
            Person person = _sessionBuilder.GetSession().CreateCriteria<Person>()
                   .Add(Restrictions.IdEq(id))
                   .SetFetchMode("Accounts", FetchMode.Eager)
                   .UniqueResult<Person>();
            tx.Commit();
            return person;
        }
    }

0voto

Paul Punkte 5416

Ok, nachdem ich versucht habe, dies auf viele verschiedene Arten zu tun, fand ich schließlich, dass die effizienteste Lösung für mich bei dieser Frage skizziert:

Eifriges Laden untergeordneter Sammlungen mit NHibernate

Meine Frage oben war eine stark vereinfachte Version der tatsächlichen Herausforderung, die ich hatte, aber mit der obigen Methode gelang es, die db-Treffer auf 2 zu bekommen ... eine enorme Verbesserung von meiner ursprünglichen Implementierung.

Vielen Dank für eure Hilfe und Hinweise, Jungs. Lernte ein bisschen auf dem Weg...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X