如何为未使用EF的自定义模型视图实现PaginatedList分页功能
解决方案
你遇到的两个报错根源分别是:
- 原有
PaginatedList的有效分页方法仅支持EF返回的IQueryable类型参数,你传入内存List时没有匹配的重载 - 你找到的泛型
CreateAsync是未实现的空方法,调用自然抛出未实现异常
你只需要新增适配内存集合的方法重载,无需修改原有分页逻辑和前端视图,就能保持和其他EF页面完全一致的分页行为:
步骤1:给PaginatedList类新增内存集合重载
在你的PaginatedList<T>类中添加如下方法,返回结构和原有EF分页方法完全一致:
public static Task<PaginatedList<T>> CreateAsync(List<T> source, int pageIndex, int pageSize) { // 内存集合直接计算总条数和分页数据,无需走数据库异步查询 var totalCount = source.Count; var pageItems = source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); // 构造返回实例和原有EF版逻辑完全对齐 return Task.FromResult(new PaginatedList<T>(pageItems, totalCount, pageIndex, pageSize)); }
如果你的PaginatedList构造函数为私有,直接参考原有EF版CreateAsync的实例构造逻辑替换即可,仅需把EF的异步查询方法CountAsync/ToListAsync换成内存集合对应的普通方法Count/ToList。
步骤2:优化控制器代码
你可以直接在LINQ查询中映射到Order类,无需手动写循环赋值,简化后的代码如下:
public async Task<IActionResult> Index(string custEmail,int pageNumber = 1) { var timeUtc = DateTime.UtcNow; var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var todayDt = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone); List<Order> orderList = (from mo in _context.MouseOrders join io in _context.InventoryOrders on mo.MouseOrderId equals io.OrderId join cus in _context.Customers on mo.CustomerId equals cus.CustomerId join i in _context.Inventories on io.InventoryId equals i.InventoryId where mo.SamaccountEmail == custEmail && mo.OrderDate.Date == todayDt.Date select new Order { CustomerNumber = cus.CustomerNumber, OrderId = mo.MouseOrderId, Genotype = i.Genotype, RoomNumber = i.RoomNumber, QuantityAvailable = i.QuantityAvailable, OrderQuantity = io.OrderQuantity }).ToList(); return View(await PaginatedList<Order>.CreateAsync(orderList, pageNumber, 5)); }
步骤3:清理无效代码
删除PaginatedList中那段抛NotImplementedException的空方法,避免后续误调用。
修改完成后运行即可,前端分页组件不需要做任何调整,分页交互、样式和其他EF页面完全一致。
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

