su posible solución se manipula en una transacción, pero serán dos llamadas a DB. Si debe tener solo una llamada de base de datos, debe usar una consulta multiquery/future como sugerencia de pares. Para obtener más información sobre la sintaxis futura, consulte esta publicación: http://ayende.com/blog/3979/nhibernate-futures.
Estas son algunas maneras de lograr su escenario ... (llamadas 2 db)
QueryOver:
var query = session.QueryOver<Organism>();
var result = query
.Skip((Page - 1) * PageSize)
.Take(PageSize)
.List();
var rowcount = query.RowCount();
Con un conjunto de muestras de 100 organismos, y las consultas a los organismos 11-20 , aquí están las dos consultas enviadas a la db:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
SELECT count(*) as y0_ FROM Organism this_
QueryOver (1 llamada db con futuro):
var query = session.QueryOver<Organism>()
.Skip((Page - 1) * PageSize)
.Take(PageSize)
.Future<Organism>();
var result = query.ToList();
var rowcount = session.QueryOver<Organism>()
.Select(Projections.Count(Projections.Id()))
.FutureValue<int>().Value;
Consulta para el mismo conjunto de datos como antes, esta es la consulta que se genera:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;SELECT count(this_.Id) as y0_ FROM Organism this_;;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
Criteria (1 llamada db con futuro):
var criteria = session.CreateCriteria<Organism>()
.SetFirstResult((Page - 1) * PageSize)
.SetMaxResults(PageSize)
.Future<Organism>();
var countCriteria = session.CreateCriteria<Organism>()
.SetProjection(Projections.Count(Projections.Id()))
.FutureValue<int>().Value;
Una vez más, la consulta para la mismo conjunto de datos, criterios con resultados futuros en la misma consulta:
SELECT TOP (@p0) Id0_0_, Title0_0_ FROM (SELECT this_.Id as Id0_0_, this_.Title as Title0_0_, ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row FROM Organism this_) as query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;SELECT count(this_.Id) as y0_ FROM Organism this_;;@p0 = 10 [Type: Int32 (0)], @p1 = 10 [Type: Int32 (0)]
Tenga en cuenta que todos los tres Los estilos de consulta e resultan en las mismas consultas exactas. La sintaxis futura simplemente permite a NHibernate hacer una llamada a la base de datos en lugar de dos.
Si está utilizando NHibernate 3, creo que la manera más elegante de manejar esto es utilizar la nueva sintaxis de QueryOver. (Usó la sintaxis NHibernate.Linq anterior en su solución propuesta. Le conviene más aprender la sintaxis QueryOver.)
Probablemente vale la pena señalar que si los dos resultados en una sola consulta es impulsada por optimizaciones específicas del dialecto. Por ejemplo, en SQLite se emiten dos consultas, pero el comportamiento es el mismo (todos los futuros se ejecutan a la vez en tan pocas consultas como sea posible) – AlexCuse