【问题标题】:PagedList with Entity Framework getting all records带有实体框架的 PagedList 获取所有记录
【发布时间】:2013-11-14 23:42:18
【问题描述】:

PagedList 是一个分页库。

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

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

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

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

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

【问题讨论】:

    标签: c# entity-framework pagedlist


    【解决方案1】:

    确实,您正在执行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&lt;T&gt; 上的扩展方法后面。

    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);
        }
    }
    

    【讨论】:

    • +1 但它只是错过了方法名称后的&lt;T&gt;ToPagedQuery&lt;T&gt;(..)
    • @Askolein 已修复,谢谢!
    • @Maarten。关于如何让它异步工作的任何想法?
    • @Thierry 调用异步方法?假设 Skip 和 Take 也可以异步使用。否则,正常调用它们,但将其包装在任务中。
    • 为什么我的数据库上下文实体是 dbquery 类型并使用 sql 字符串获取数据?你能检查这个链接吗stackoverflow.com/questions/66020780/…
    【解决方案2】:

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

    _dbContext.Products.OrderBy(p => p.Id).AsEnumerable().ToPagedList(1, 25);
    

    【讨论】:

    • 你甚至不需要这个AsEnumerable()。可以直接使用_dbContext.Products.OrderBy(p =&gt; p.Id).ToPagedList(1, 25);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多