2009-07-28 5 views
6

Sono pigro nel caricare le raccolte, e anche perché ci sono tanti campi nella tabella delle persone, sto scrivendo una funzione di proiezione per recuperare solo determinate proprietà. Funziona con proprietà, ma non con raccolte di altre entità. Sarei perfetto se fossero caricati come proxy e potrei averli in seguito, ma in questo momento si carica solo in null.Come utilizzare le Proiezioni NHibernate per recuperare una collezione

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; 
     } 

risposta

1

Quante proprietà hai? Ne ho circa 30 in più su un'entità Client e non ci sono problemi durante il caricamento in NH.

Potresti essere preoccupato per le prestazioni quando non è proprio il caso. (Il vecchio: ottimizzazione prematura è la radice di ogni male" :))

Dopo aver detto questo - dubito qualcosa di simile è supportata

+0

ho circa 80 proprietà, quindi è davvero necessario in questa situazione, sono abbastanza sicuro di non poterlo recuperare con questo codice, ma penso che ci sia un modo con le proiezioni di essere in grado di recuperare solo 1 di molte collezioni. – luke

+0

in In tal caso, potresti avere più fortuna nel gruppo nhusers su gruppi google – sirrocco

+0

Ho è pubblicato lì. Se ricevo una risposta, non posso postarla qui. Grazie. – luke

2

provare a utilizzare 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>();