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
相关产品推荐
相关产品推荐

