2010-01-05 9 views
10

Pour la pagination obtenir une page à partir d'une base de données que je dois exécuter quelque chose comme ceci:Obtenez le nombre total d'enregistrements lorsque vous faites

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

Cela va sauter les 10 premières lignes et sélectionnera les 10 prochaines

Comment puis-je savoir combien de lignes résulteraient de la requête sans pagination? Je ne veux pas lancer une autre requête pour obtenir le compte.

Répondre

16

Pour obtenir le nombre total d'enregistrements avant de passer, vous devez exécuter une requête distincte. Obtenir le nombre réel retourné utiliserait Count(), mais ne donnerait pas une autre requête si la requête d'origine était matérialisée.

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

Est-ce la séparation des 2 résultats de la requête dans perfomence bas pour un bon nombre de données et complexe où les conditions? –

9

Ligne de fond: vous devez exécuter deux requêtes. Vous ne pouvez tout simplement pas le contourner.

Voici une bonne façon de le faire, cependant, qui met en cache la requête LINQ d'origine et le filtre, ce qui rend pour le moins d'erreurs de copier/coller:

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

J'ai juste pensé à le faire - mais une question; appellera le q.Count(); charger tous les enregistrements en mémoire? – effkay

+3

Non, q.Count() générera une requête SQL 'SELECT COUNT (*)'. –

+4

N ° d'appel q.Count() entraînera SQL sur les lignes de SELECT count (*) où ... ', qui ne retournera qu'une valeur entière. Aucun enregistrement ne sera chargé en mémoire. – Randolpho