Самый популярный вариант пагинации в EF Core выглядит так:
var customers = await dbContext.Customers
.AsNoTracking()
.Where(c => c.IsActive)
.OrderBy(c => c.Id)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
🔵 Под капотом EF Core генерирует SQL с OFFSET/FETCH:
SELECT *
FROM Customers
ORDER BY Id
OFFSET 200 ROWS
FETCH NEXT 100 ROWS ONLY
Для небольших таблиц этого обычно достаточно.
❗️ Но есть нюанс: чем дальше страница, тем больше строк СУБД приходится пропускать перед возвратом результата.
Поэтому для больших таблиц и бесконечной прокрутки часто используют Keyset Pagination:
var customers = await dbContext.Customers
.Where(c => c.Id > lastSeenId)
.OrderBy(c => c.Id)
.Take(pageSize)
.ToListAsync();
Такой подход не требует пропускать тысячи строк и обычно масштабируется заметно лучше.
📌 Простая навигация по страницам → Skip/Take
📌 Большие таблицы и высокая нагрузка → Keyset Pagination
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view