Résultats de recherche paginés avec LINQ à SQL
Quel est le meilleur modèle pour obtenir des résultats paginés avec LINQ to SQL ?
J'ai le scénario suivant:
Supposons que je recherche d'éléments de table par description. Je peux facilement faire:
public IQueryable<Item> FindItemsByDescription(string description)
{
return from item in _dc.Items
where item.Description.Contains(description);
}
Maintenant, quelle serait la meilleure façon de paginer ce jeu de résultats?
- dois-je effectuer une requête count avant de le faire pour connaître la taille du jeu de résultats, puis limiter cette requête en fonction de ce que je veux? J'ai l'impression que c'est la façon dont aller.
- dois-je effectuer la requête complète, prendre le nombre de la taille du tableau et ne renvoyer qu'un sous-ensemble paginé de ce tableau? Je pense que ce sera une énorme perte de temps si le resultset est assez grand... Ou LINQ to SQL fait-il de la magie ici?
Existe-t-il un modèle commun LINQ to SQL pour effectuer cette opération?
EDIT: je dois clarifier une petite chose. Je suis au courant des méthodes Take et Skip. Mais, avant de l'utiliser prendre et Sauter , Comment dois-je obtenir le Nombre total {[33] } des résultats que la requête récupérerait?
2 réponses
Le modèle de pagination est très simple. Cela implique l'utilisation des méthodes D'extension Skip() et Take() comme suit:
public IQueryable<Item> FindItemsByDescription(string description, int pageIndex, int pageSize)
{
return from item in _dc.Items
where item.Description.
Contains(description).
Skip((pageIndex - 1) * pageSize).
Take(pageSize);
}
UPDATE: pour obtenir le nombre total, utilisez simplement la méthode Count ():
int totalCount = from item in _dc.Items
where item.Description.
Contains(description).Count();
int numberOfPages = (int)(totalCount/pageSize);
Selon la façon dont vous allez afficher les enregistrements, Vous pouvez utiliser le numberOfPages pour afficher une barre de navigation avec "Page X of Y" ... Page 1 de 10, etc..
Vous pouvez utiliser la méthode D'extension Take:
public IQueryable<Item> FindItemsByDescription(string description, int resultAmount)
{
return from item in _dc.Items
where item.Description.Contains(description).Take(resultAmount);
}
Vous pouvez aller plus loin et utiliser Skip pour les "pages" suivantes:
public IQueryable<Item> FindItemsByDescription(string description, int resultAmount, int page)
{
return from item in _dc.Items
where item.Description.Contains(description).Skip(resultAmount * page).Take(resultAmount);
}