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