usando QueryOver – NHibernate

La versión 3.0 de NHibernate introduce QueryOver, que es una abstracción sobre ICriteria que permite hacer consultas sin usar magic strings, esto representa una gran ventaja sobre ICriteria porque puedo refactorizar sin problemas.

Un ejemplo simple para obtener todas las órdenes con fecha menor a hoy:

_session.QueryOver<Orden>().Where(o => o.Fecha < DateTime.Today).List();

A eso lo puedo ordenar usando OrderBy:

_session.QueryOver<Orden>().Where(o => o.Fecha < DateTime.Today).OrderBy(o => o.Fecha).Desc.ThenBy(o => o.Cliente).Asc.List()

Puedo utilizar los operadores lógicos para armar mi consulta:

_session.QueryOver<Cliente>().Where(c => c.Apellidos == "Assange" && c.Nombres == "Julian").SingleOrDefault();

Y en este caso usé SingleOrDefault en vez de List para cuando es una sola instancia.

Para hacer una consulta por propiedades de un objeto referenciado uso JoinQueryOver, por ejemplo para obtener las órdenes que hizo Julian Assange:

_session.QueryOver<Orden>().JoinQueryOver(o => o.Cliente).Where(c => c.Apellidos == "Assange" && c.Nombres == "Julian").List();

Eso funciona también para colecciones:

_session.QueryOver<Orden>().JoinQueryOver(o => o.Lineas).Where(l => l.Cantidad > 1).List();

Contar la cantidad de órdenes es tán fácil como:

_session.QueryOver<Orden>().RowCount();

Paginado:

_session.QueryOver<Orden>().Skip(10).Take(10).List();

Puedo incluso definir la “fetch strategy” de la query, por ejemplo para traerme junto con la orden sus lineas:

_session.QueryOver<Orden>().Fetch(c => c.Lineas).Eager.List();

Projections:

_session.QueryOver<Producto>().Select(p => p.Codigo, p => p.Precio).List<object[]>().Select(
	properties => new
	{
		Codigo = (string)properties[0],
		Precio = (decimal)properties[1]
	});

Más info:
http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s