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

如何为未使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:03