2009-07-28 14 views
6

Me da pereza cargar las colecciones, y también porque hay tantos campos dentro de la tabla de personas, estoy escribiendo una función de proyección para recuperar solo ciertas propiedades. Funciona con propiedades, simplemente no colecciones de otras entidades. Estaría bien si fueran cargados como proxies y podría obtenerlos más tarde, pero ahora mismo se carga en nulo.Cómo usar las proyecciones de NHibernate para recuperar una colección

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

Respuesta

1

¿Cuántas propiedades tiene? Tengo alrededor de 30 tal vez más en una entidad Cliente y no hay ningún problema al cargarlo en NH.

Usted podría estar preocupado por el rendimiento cuando en realidad no es el caso. (La antigua: optimización prematura es la raíz de todo mal" :))

Habiendo dicho esto - Dudo que algo como esto es apoyado

+0

tengo alrededor de 80 propiedades, por lo que es realmente necesario en esta situación. Estoy bastante seguro de que no puedo recuperarlo con este código, pero creo que hay alguna manera con las proyecciones para poder recuperar solo 1 de muchas colecciones. – luke

+0

in ese caso, es posible que tengas más suerte en el grupo de nhusers en los grupos de google – sirrocco

+0

Tengo publicado allí. Si recibo una respuesta, la publicaré aquí. Gracias. – luke

2

intentar usar 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>(); 
Cuestiones relacionadas