PagedList с Entity Framework получает все записи

PagedList - это пейджинговая библиотека.

_dbContext.Products.ToList().ToPagedList(1, 25);

Выше код получит первые 25 записей в базе данных для страницы 1.

Проблема в том, что ToList() Вызов получит все записи в базе данных. Тогда ToPageList() Вызов выберет первые 25 записей.

Как мне объединить EF с PagedList, чтобы я получил только первые 25 записей в базе данных? И не получить все записи, а затем взять первые 25 записей.

PS: я должен написать свою собственную библиотеку подкачки или использовать онлайн-библиотеку? Пожалуйста, предложите мне любую другую библиотеку.

2 ответа

Решение

Действительно, вы делаете ToList(), поэтому запрос будет выполнен, и отложенное выполнение больше не будет отложено.

Вы можете попробовать это без ToList() звоните, но все зависит от реализации ToPagedList(int, int) метод.

Вы можете просто сделать пейджинг самостоятельно.

const int pageSize = 25;
const int pageNumber = 1;

IQueryable<Product> query = _dbContext.Products;
var pagedQuery = query.Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList();

И да, вы можете просто скрыть эту логику за методом расширения на IQueryable<T>,

public static class IQueryableExtensions {
    public static IQueryable<T> ToPagedQuery<T>(this IQueryable<T> query, int pageSize, int pageNumber) {
        return query.Skip(pageSize * (pageNumber - 1)).Take(pageSize);
    }
}

Самое простое решение - использовать AsEnumerable() но это требует заказа. В отличие от ToList(), AsEnumerable() не попадает в базу данных.

_dbContext.Products.OrderBy(p => p.Id).AsEnumerable().ToPagedList(1, 25);
Другие вопросы по тегам