Paginé de résultats de recherche avec LINQ to SQL
Quel est le meilleur modèle pour obtenir paginé résultats avec LINQ to SQL?
J'ai le scénario suivant:
Supposons que je recherche éléments table par description. Je peux facilement le faire:
public IQueryable<Item> FindItemsByDescription(string description)
{
return from item in _dc.Items
where item.Description.Contains(description);
}
Maintenant, quel serait le meilleur moyen pour paginer cet ensemble de résultats?
- Devrais-je effectuer une compter requête avant de le faire pour trouver le résultat de la taille de l'ensemble et puis la limite de cette requête en fonction de ce que je veux? J'ai l'impression que c'est le chemin à parcourir.
- Dois-je effectuer la requête complète, prendre le comptage à partir de la taille de la matrice et de ne retourner qu'un paginé sous-ensemble de cet ensemble? J'ai le sentiment que ce sera une énorme perte de temps si le jeu de résultats est assez grand... Ou est LINQ to SQL faire de la magie ici?
Est-il un LINQ to SQL modèle commun pour la réalisation de cette opération?
EDIT: je doit préciser une petite chose. Je suis conscient de Prendre et de Sauter méthodes. Mais, avant d'utiliser Prendre et Sauter, comment dois-je obtenir le nombre total de résultats de la requête souhaitez récupérer?
Vous devez vous connecter pour publier un commentaire.
Le modèle pour la pagination est très simple. Il implique l'utilisation de la benne() et de Prendre() les méthodes d'extension comme suit:
Mise à JOUR: Pour obtenir le nombre total de simplement utiliser la méthode Count ():
Selon la façon dont vous allez à l'affichage des enregistrements, vous pouvez utiliser le numberOfPages pour afficher une barre de navigation avec "Page X sur Y" ... Page 1 de 10, etc..
int numberOfPages = (int) Math.Ceiling((double) totalCount/pageSize);
var Queryobj = (from item in _dc.Items where item.Description.Contains(description)); int totalCount = Queryobj.Count(); ... return QueryObj.Skip((pageIndex - 1) * pageSize).Take(pageSize);
Serait que d'exécuter la clause where à deux reprises dans la base de données et ne retourne la valeur du premier bit et puis paginé de valeurs pour le retour?Vous pouvez utilisez la méthode d'extension:
Vous pouvez prendre un peu plus loin et utiliser le branchement pour la suite des "pages":