2009-06-11 6 views
0

J'utilise LINQ to SQL pour rechercher une base de données assez volumineuse et je ne suis pas sûr de la meilleure approche pour effectuer une pagination avec un DataPager. Je connais les méthodes Skip() et Take() et je les ai correctement. Toutefois, je ne peux pas utiliser le nombre de résultats pour le datapager, car ils seront toujours la taille de la page comme déterminé dans la méthode Take().LINQ to SQL et DataPager

Par exemple:

var result = (from c in db.Customers 
       where c.FirstName == "JimBob" 
       select c).Skip(0).Take(10); 

Cette requête renvoie toujours 10 ou moins de résultats, même s'il y a 1000 JimBobs. Par conséquent, le DataPager pense toujours qu'il n'y a qu'une seule page et que les utilisateurs ne peuvent pas naviguer dans l'intégralité du jeu de résultats. J'ai vu un article en ligne où l'auteur a juste écrit une autre requête pour obtenir le nombre total et appelé cela.

Quelque chose comme:

int resultCount = (from c in db.Customers 
        where c.FirstName == "JimBob" 
        select c).Count(); 

et utilisé cette valeur pour la DataPager. Mais je préférerais ne pas avoir à copier et coller chaque requête dans un appel séparé où je veux mettre en page les résultats pour des raisons évidentes. Existe-t-il un moyen plus simple de le faire qui peut être réutilisé sur plusieurs requêtes?

Merci.

Répondre

0

Dans des situations comme celle-ci, je renvoie parfois le nombre total d'enregistrements en tant que champ dans mon jeu de résultats à partir de la base de données.

Fondamentalement, vous n'avez que les deux options, écrire une autre requête spécifiquement pour le nombre, ou le retourner en tant que colonne dans les résultats.

0

Rappelez-vous que LINQ fournit l'exécution des requêtes defferred ...

var qry =  from c in db.Customers    
       where c.FirstName == "JimBob" 
       select c; 

int resultCount = qry.Count(); 

var results = qry.Skip(0).Take(10); 
+0

Merci. Je me suis vraiment éloigné de cette approche depuis ma publication car je n'ai pas pu obtenir les performances requises par le site. Est-ce que le code ci-dessus frappe seulement la base de données une fois? –

+0

Non, il va frapper la base de données deux fois. – TGnat