Estoy escribiendo un criterio NHibernate que selecciona los datos que admiten la búsqueda. Estoy usando la expresión COUNT(*) OVER()
de SQL Server 2005 (+) para obtener la cantidad total de filas disponibles, como suggested por Ayende Rahien. Necesito ese número para poder calcular cuántas páginas hay en total. La belleza de esta solución es que no necesito ejecutar una segunda consulta para obtener el recuento de filas.Agregar una proyección a un criterio NHibernate le impide realizar la selección de entidad predeterminada
Sin embargo, parece que no logro escribir un criterio de trabajo (Ayende solo proporciona una consulta HQL).
Aquí hay una consulta SQL que muestra lo que quiero y funciona muy bien. Tenga en cuenta que intencionalmente en la lógica de paginación real para centrarse en el problema:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
aquí está el HQL:
select
item, rowcount()
from
Item item
Tenga en cuenta que la función rowcount()
se ha registrado en una costumbre NHibernate dialecto y resuelve COUNT(*) OVER()
en SQL.
El requisito es que la consulta se exprese utilizando un criterio. Por desgracia, no sé cómo hacer las cosas bien:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Siempre que añado una proyección, NHibernate no selecciona item
(como lo haría sin una proyección), mientras que sólo el rowcount()
Realmente necesito tanto. Además, parece que no puedo proyectar item
como un todo, solo sus propiedades y realmente no quiero enumerarlas todas.
Espero que alguien tenga una solución para esto. Gracias de cualquier manera.
Usando CreateMultiCriteria resultaría en dos consultas SQL separadas a generar. Aunque se ejecutarán en un solo lote, aún así no sería tan eficiente como ejecutar solo una consulta. Deseo 'SELECT *, COUNT (*) OVER() AS rowcount FROM Items', no 'SELECT * FROM Items; SELECCIONAR COUNT (*) COMO rowcount FROM Items 'como el escenario CreateMultiCriteria me atraparía. –