À l'aide de Skip
et Take
est certainement le chemin à parcourir. Si j'étais la mise en œuvre de la présente, je serais probablement écrire ma propre méthode d'extension pour gérer la pagination (pour rendre le code plus lisible). La mise en œuvre peut bien sûr utiliser Skip
et Take
:
static class PagingUtils {
IEnumerable<T> Page(this IEnumerable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
IQueryable<T> Page(this IQueryable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
}
La classe définit deux méthodes d'extension - l'une pour l' IEnumerable
et l'autre pour IQueryable
, ce qui signifie que vous pouvez l'utiliser avec les deux LINQ to Objects et LINQ to SQL (lors de l'écriture de requête de base de données, le compilateur va chercher l' IQueryable
version).
En fonction de votre pagination conditions, vous pouvez aussi ajouter du comportement (par exemple pour gérer les négatifs pageSize
ou page
de la valeur). Voici un exemple de comment vous pouvez utiliser cette méthode d'extension dans votre requête:
var q = (from p in products
where p.Show == true
select new { p.Name }).Page(10, pageIndex);