2010-02-05 14 views
6

supongamos que en una entidad existen atributos id, nombre de usuario, edad, dirección. Ahora solo quiero identificación y nombre de usuario y uso este código para ello.Proyecciones en NHibernate

Las proyecciones permiten la devolución de algo que no sea una lista de entidades de una consulta.

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .List(); 

Cómo recuperar los valores. ¿En qué objeto se tomarán estos valores?

Respuesta

27

A menos que se utilice un transformador de resultados, una proyección dará como resultado una lista de objetos anónimos con los valores proyectados. Esto sería suficiente para el enlace de datos.

Para otros usos, desea establecer un transformador de resultados que creará objetos de un tipo conocido. El AliasToBeanTransformer creará un objeto del tipo especificado para cada fila y establecerá sus propiedades en los valores de fila.

Si conoce el tipo de resultados, puede utilizar el método genérico List<T>().

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

Los transformadores de resultados también se pueden utilizar en consultas SQL y HQL.

list2 = Session.CreateSQLQuery("select Id, Username from user_table") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

list2 = Session.CreateQuery("select Id, Username from User") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

En estos ejemplos, la clase Resultado no necesita ser una clase correlacionada, y debe tener las propiedades seleccionadas.

partial class Result 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
} 
+0

Aunque no utilicé el framework 3.0 (palabra clave var), ¡finalmente pude descubrir cómo seleccionar columnas individuales usando esta respuesta! me llevó todo el día para encontrarlo –