NHibernate consulta createCriteria
-
27-09-2019 - |
Pregunta
¿Es posible elegir qué columnas que quiero a cambio de session.createCriteria ()?
EGZ:.
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
y hay una manera de añadir algo así como "seleccione Apellido" para evitar la descarga de toda la fila.
Solución
crea una clase que tiene sólo las propiedades que necesita, a menudo se trata de una clase de resumen como {Id, Etiqueta} y que había reutilizar en cualquier lugar que necesita un tipo simple, en una lista, por ejemplo. Utilice ProjectionList para definir qué columnas para volver. A continuación, utilice Transformers.AliasToBean para transformar el resultado a su tipo simple.
ProjectionList projectionList = Projections.ProjectionList();
projectionList.Add(Projections.Property("EmployeeID"), "Id");
projectionList.Add(Projections.Property("EmployeePosition"), "Label");
var x = DetachedCriteria.For(Employee);
x.SetProjection(projectionList);
x.SetResultTransformer(Transformers.AliasToBean(SimpleType)));
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>();
Otros consejos
Se puede hacer esto utilizando proyecciones:
IList<Object[]> list = session.CreateCriteria(typeof(Employee))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("FirstName"))
.Add(Projections.Property("LastName"))
).List<Object[]>();
foreach( Object[] person in list )
{
String firstName = person[0];
String lastName = person[1];
}
Confirmar el espacio de nombres NHibernate.Expressions para otras proyecciones también.
Yo sugeriría dando LINQ to NHibernate intentarlo. Se le permitirá hacer lo que piden de una manera muy natural.