2009-07-28 9 views
6

Ich bin faul laden der Sammlungen, und auch weil es so viele Felder in der Person Tabelle gibt, schreibe ich eine Projektionsfunktion nur bestimmte Eigenschaften abrufen. Es funktioniert mit Eigenschaften, nur nicht mit Sammlungen anderer Entitäten. Es würde mir gut gehen, wenn sie als Proxies geladen würden und ich sie später holen könnte, aber im Moment lädt sie nur in null.So verwenden Sie NHibernate Projektionen zum Abrufen einer Sammlung

public IList<Person> ListTop40() 
     { 
      var list = _session.CreateCriteria(typeof(Person)) 
        .SetProjection(Projections.ProjectionList() 
        .Add(Projections.Property("FirstName")) 
        .Add(Projections.Property("LastName")) 
        .Add(Projections.Property("Jersey")) 
        .Add(Projections.Property("FortyYard")) 
        .Add(Projections.Property("BenchReps")) 
        .Add(Projections.Property("VertJump")) 
        .Add(Projections.Property("ProShuttle")) 
        .Add(Projections.Property("LongJump")) 
        .Add(Projections.Property("PersonSchoolCollection")) 
        ) 
        .List<IList>() 
        .Select(l => new Person() { FirstName = (string)l[0], LastName = (string)l[1], Jersey = (Decimal)l[2], FortyYard = (Decimal)l[3], BenchReps = (Decimal)l[4], VertJump = (Decimal)l[5], ProShuttle = (Decimal)l[6], LongJump = (Decimal)l[7], PersonSchoolCollection = (IList<Person_School>)l[8]}); 

      IList<Person> s = list.ToList(); 
      return s; 
     } 

Antwort

1

Wie viele Immobilien haben Sie? Ich habe ungefähr 30 vielleicht mehr auf einer Klientenentität und es gibt kein Problem, wenn es in NH geladen wird.

Sie könnten sich Sorgen um die Leistung machen, wenn es nicht wirklich der Fall ist. (Die alte: vorzeitige Optimierung ist die die Wurzel allen Übels“:))

Nachdem das gesagt hat - ich bezweifle, so etwas wie dies unterstützt wird

+0

Ich habe ungefähr 80 Eigenschaften, also ist es wirklich notwendig in dieser Situation.Ich bin mir ziemlich sicher, dass ich es mit diesem Code nicht abrufen kann, aber ich denke, dass es einen Weg mit Projektionen gibt, nur eine von vielen Sammlungen abzurufen. – luke

+0

in In diesem Fall haben Sie vielleicht mehr Glück in der Nhusers-Gruppe auf Google-Gruppen – sirrocco

+0

Ich habe es hat dort gepostet. Wenn ich eine Antwort bekomme, dann poste es hier. Vielen Dank. – luke

2

versuchen Sie es mit AliasToBeanResultTransformer.

var list = _session.CreateCriteria(typeof(Person)) 
       .SetProjection(Projections.ProjectionList() 
       .Add(Projections.Property("FirstName")) 
       .Add(Projections.Property("LastName")) 
       .Add(Projections.Property("Jersey")) 
       .Add(Projections.Property("FortyYard")) 
       .Add(Projections.Property("BenchReps")) 
       .Add(Projections.Property("VertJump")) 
       .Add(Projections.Property("ProShuttle")) 
       .Add(Projections.Property("LongJump")) 
       .Add(Projections.Property("PersonSchoolCollection")) 
       ) 
       .SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person))) 
       .List<Person>();