Loupe

Pagination avec LinQ en utilisant Skip() et Take()

Bonjour à tous !

Aujourd'hui je vais vous montrer un moyen très simple de faire de la pagination avec LinQ pour vos méthodes GET d'api en utilisant Skip() et Take(). 

Récupérer un grand nombre d'éléments (ex: 600 utilisateurs) sur une page entraîne nécessairement des problèmes de performance pour l'affichage de ces données. Pour remédier à ces problèmes, on va indiquer à notre api combien d'éléments on veut récupérer (PageSize) et combien d'éléments on a déjà récupéré (PageSize * PageNumber).

Pour l'utilisateur, côté front, cela se traduit soit par des numéros de pages, soit par un infinite scroll. La différence entre ces deux résultats vient du fait que pour une pagination avec des numéros, le call api sera fait au clic sur le numéro (qui correspond au PageNumber), et pour un infinite scroll le call sera fait ... au scroll !

Comment faire ? 

Votre méthode GET d'api prendra deux nouveaux paramètres : PageNumber (int) et PageSize (int). Le PageNumber est le numéro de la page que vous souhaitez et le PageSize est le nombre d'éléments que votre page va contenir.

On peut alors faire le savant calcul du nombre d'éléments que l'on a déjà récupéré (et donc que l'on veut "passer"):

var elementsToSkip = pageNumber * pageSize
  • pageNumber = 0 et pageSize = 10 signifie "Je veux les 10 éléments de la première page"
  • pageNumber = 1 et pageSize = 10 signifie "Je veux les 10 éléments de la deuxième page" donc on aura récupéré les 10 d'après car elementsToSkip = 10

Mise en pratique !

Votre requête ressemblera donc à ça:

public async Task<List<User>> Handle(GetUsersWithPagination request, CancellationToken cancellationToken) {

var elementsToSkip = pageNumber * pageSize;

List<User> users= (from u in this.dbContext.User select u).Skip(elementsToSkip).Take(pageSize).ToListAsync(cancellationToken);

}

C'est aussi simple que ça ! N'oubliez pas que la première page correspond à pageNumber = 0 (pour que elementsToSkip soit égal à 0 lorsque vous souhaitez récupérer les premiers éléments de votre liste)

À bientôt ! 

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus