未使用 EF 的视图的分页

Posted

技术标签:

【中文标题】未使用 EF 的视图的分页【英文标题】:Pagination for the view which is not using the EF 【发布时间】:2021-12-16 16:07:11 【问题描述】:

我正在尝试向 Index()/视图添加分页,此索引视图使用自定义模型,这不是数据库中的表。我正在尝试查看是否可以使用 PaginatedList.cs,因为我在同一个项目中的其他页面使用 EF 并且分页效果很好。

下面是我的 index()

  public async Task<IActionResult> Index(string custEmail,int pageNumber = 1)
    
        List<Order> oo = new List<Order>();

        var timeUtc = DateTime.UtcNow;
        var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        var todayDt = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);

        var orderData = 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
                        
                           CustomerNumber= cus.CustomerNumber,
                           OrderID = mo.MouseOrderId,
                           Genotype = i.Genotype,
                            RoomNumber = i.RoomNumber,
                            QuantityAvailable = i.QuantityAvailable,
                            OrderQuantity = io.OrderQuantity
                        ;

       foreach (var item in orderData)
        
            Order o = new Order();
            o.CustomerNumber = item.CustomerNumber;
            o.OrderId = item.OrderID;
            o.Genotype = item.Genotype;
            o.RoomNumber = item.RoomNumber;
            o.QuantityAvailable = item.QuantityAvailable;
            o.OrderQuantity = item.OrderQuantity;
            oo.Add(o);
        
        return View(await PaginatedList<Order>.CreateAsync(oo,pageNumber,5));
    

但我得到类似的错误

Cannot convert from 'System.Collections.Generic.List&lt;JSMApp.Models.Order&gt;' to 'System.Linq.IQueryable&lt;JSMApp.Models.Order&gt;'

我尝试将 List List&lt;Order&gt; 更改为 IQueryable,但即使这样也会引发错误。

我正在尝试使用与使用 EF 和 PaginatedList 的其他页面相同的分页行为/外观,但不确定如何处理自定义模型而不是来自 DB 的模型

编辑* 当我尝试访问 Index() 页面时,出现以下错误

An unhandled exception occurred while processing the request. NotImplementedException: The method or operation is not implemented. JSMApp.PaginatedList&lt;T&gt;.CreateAsync&lt;TEntity&gt;(IQueryable&lt;TEntity&gt; entities, int v, int pageSize) in PaginatedList.cs, line 53

下面是它在 PaginatedList 中抛出错误的行

 internal static Task<string> CreateAsync<TEntity>(IQueryable<TEntity> entities, int v, int pageSize) where TEntity : class
    
        throw new NotImplementedException();
    

【问题讨论】:

您可以简单地查询数据库模型,然后在 Index 方法中将该模型映射到视图模型。 很抱歉我无法关注你。我的查询和所有工作,但我无法进行分页。如果您看到上面的查询必须从不同的表中提取数据 您正在投影select new ... 中创建一个匿名类型。但看起来你可以创建一个订单select new Order...。然后可以将IQueryable&lt;Order&gt; orderData 传递给PaginatedList @JeremyLakeman 但是如何将连接表中的字段映射到订单?可以举个例子吗 使用标准成员初始化。语法不会改变你已经拥有的。 CustomerNumber = cus.CustomerNumber, ... 【参考方案1】:

你快到了。只是改变;

select new

    CustomerNumber= cus.CustomerNumber,
    OrderID = mo.MouseOrderId,
    // etc

select new Order

    CustomerNumber= cus.CustomerNumber,
    OrderID = mo.MouseOrderId,
    // etc

现在您的orderData 将是一个可以传递的IQueryable&lt;Order&gt;

PaginatedList<Order>.CreateAsync(orderData,pageNumber,5))

【讨论】:

请注意,您可以改为从匿名类型创建分页列表。但我认为您不能基于此定义视图模型。 谢谢你,但我运行出错,添加了错误的截图 什么是JAXSurplusMouseApp?那是你的源代码吗?那么为什么你的 CreateAsync 方法抛出没有实现呢? (而且,不要将文本作为图像发布..)

以上是关于未使用 EF 的视图的分页的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core API 项目中的分页

如何从分页的 ef 核心查询中获取可用的总行数

如何在 iOS 的分页滚动视图中缩放图像?

WPF 中的分页集合视图

如何在swift 3中的表视图单元格中实现集合视图的分页?

横向模式下的分页视图控制器