You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core使用PagingList<T>.CreateAsync()分页报错的代码修改方案

解决PagingList.CreateAsync()的类型转换错误

你遇到的这个错误,根源是PagingList<T>.CreateAsync()方法要求第一个参数是**IOrderedQueryable<T>**类型,但你现在传给它的是已经加载到内存的List<UserListViewModel>(因为你调用了.ToList()把查询结果直接落地成列表了),这俩类型不兼容,所以才会报转换错误。

修改步骤:

  • 去掉.ToList()调用,保留查询的IOrderedQueryable状态,这样PagingList才能在数据库层面执行分页逻辑(而不是把所有数据都加载到内存再分页,后者性能极差)。
  • 不需要提前实例化List<UserListViewModel>,直接把查询赋值给变量即可。

修改后的完整Action代码:

[HttpGet]
public async Task<IActionResult> Index(int page = 1)
{
    // 保留IOrderedQueryable,不调用ToList()
    var model = _userManager.Users.AsNoTracking()
        .Select(u => new UserListViewModel
        {
            Id = u.Id,
            FullName = u.FirstName + " " + u.LastName,
            Email = u.Email
        })
        .OrderBy(u => u.Id);

    var modelPaging = await PagingList<UserListViewModel>.CreateAsync(model, 10, page);
    return View(modelPaging);
}

为什么要这么改?

当你调用.ToList()时,EF Core会立即执行SQL查询,把所有用户数据都加载到内存里变成List,这时候再传给CreateAsync,它既没办法做数据库层面的分页,类型也不匹配。而保留IOrderedQueryable的话,PagingList会在内部自动添加Skip和Take的逻辑,最后只从数据库获取当前页需要的10条数据,性能会好很多。

内容的提问来源于stack exchange,提问作者topcool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:53