La dificultad con el uso de futuros con LINQ es que las operaciones como conde ejecutan inmediatamente.
Como @vandalo descubrió, Count()
después de ToFuture()
realmente ejecuta el Conde en la memoria, lo cual es malo.
La única forma de obtener el conteo en una futura consulta LINQ es usar GroupBy
en un campo invariable. Una buena opción sería algo que ya forma parte de los filtros (como una propiedad "IsActive")
He aquí un ejemplo suponiendo que tiene una propiedad tal en pago:
//Create base query. Filters should be specified here.
var query = session.Query<Payment>().Where(x => x.IsActive == 1);
//Create a sorted, paged, future query,
//that will execute together with other statements
var futureResults = query.OrderByDescending(payment => payment.Created)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToFuture();
//Create a Count future query based on the original one.
//The paged query will be sent to the server in the same roundtrip.
var futureCount = query.GroupBy(x => x.IsActive)
.Select(x => x.Count())
.ToFutureValue();
//Get the results.
var results = futureResults.ToArray();
var count = futureCount.Value;
Por supuesto, la alternativa es haciendo dos viajes de ida y vuelta, lo cual no es tan malo de todos modos. Todavía se puede volver a utilizar el IQueryable original, que es útil cuando se desea hacer la paginación en una capa de nivel superior:
//Create base query. Filters should be specified here.
var query = session.Query<Payment>();
//Create a sorted, paged query,
var pagedQuery = query.OrderByDescending(payment => payment.Created)
.Skip((page - 1) * pageSize)
.Take(pageSize);
//Get the count from the original query
var count = query.Count();
//Get the results.
var results = pagedQuery.ToArray();
actualización (2011-02-22): Escribí un blog post sobre este tema y una solución mucho mejor.
Uso Session.QueryOver lugar - se ahorra intelisense y 'compileability', y hay un método SelectCount. Si lo necesita, puedo proporcionar detalles del uso de él – Genius
Sí, por favor, ¡QueryOver parece funcionar bien también! – Allrameest
(detecté un error en mi solución y la eliminé para evitar confusiones. En breve publicaré la versión fija) –