9

PagedList 是一个分页库。

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

上面的代码将获得第 1 页的数据库中的前 25 条记录。

问题是ToList()调用将获取数据库中的所有记录。然后ToPageList()调用将选择前 25 条记录。

如何将 EF 与 PagedList 结合使用,以便仅获得数据库中的前 25 条记录?并没有得到所有记录,然后取前 25 条记录。

PS:我应该编写自己的分页库还是使用在线库?请向我推荐任何其他图书馆。

4

2 回答 2

8

事实上,你正在做一个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);
    }
}
于 2013-11-05T08:31:00.923 回答
6

最简单的解决方案是使用AsEnumerable(),但需要订购。不像ToList(),AsEnumerable()不会命中数据库。

_dbContext.Products.OrderBy(p => p.Id).AsEnumerable().ToPagedList(1, 25);
于 2015-11-27T09:23:29.807 回答