2010-01-05 14 views
10

Para obtener una página de una base de datos que tengo que ejecutar algo como esto:Obtener el número total de registros cuando se hace la paginación

var cs = (from x in base.EntityDataContext.Corporates 
    select x).Skip(10).Take(10); 

Esto saltará las primeras 10 filas y seleccionará el próximo 10.

¿Cómo puedo saber cuántas filas resultarían debido a la consulta sin paginación? No quiero ejecutar otra consulta para obtener el conteo.

Respuesta

16

Para obtener el número total de registros antes de omitir/tomar, debe ejecutar una consulta por separado. Obtener el número real devuelto usaría Count(), pero no daría lugar a otra consulta si la consulta original se materializó.

var q = from x in base.EntityDataContext.Corporates 
     select x; 

var total = q.Count(); 
var cs = q.Skip(10).Take(10); 
var numberOnSelectedPage = cs.Count(); 
+0

¿Es esta separación de 2 resultados de la consulta en perfomence inferior para las porciones de datos y complejo donde las condiciones? –

9

Conclusión: debe ejecutar dos consultas. Simplemente no puedes evitarlo.

He aquí una buena manera de hacerlo, sin embargo, que almacena en caché la consulta LINQ original y filtro, para hacer menos errores de copiar/pegar:

var qry = from x in base.EntityDataContext.Coporates select x; 
var count = qry.Count(); 
var items = qry.Skip(10).Take(10).ToList(); 
+1

Solo pensé en hacerlo, pero una pregunta; llamará a q.Count(); cargar todos los registros en la memoria? – effkay

+3

No, q.Count() generará una consulta SQL 'SELECT COUNT (*)'. –

+4

No. Llamar a q.Count() dará como resultado SQL a lo largo de las líneas de 'SELECT count (*) where ...', que solo devolverá un valor entero. No se cargarán registros en la memoria. – Randolpho

Cuestiones relacionadas