未使用 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<JSMApp.Models.Order>' to 'System.Linq.IQueryable<JSMApp.Models.Order>'
我尝试将 List List<Order>
更改为 IQueryable,但即使这样也会引发错误。
我正在尝试使用与使用 EF 和 PaginatedList 的其他页面相同的分页行为/外观,但不确定如何处理自定义模型而不是来自 DB 的模型
编辑* 当我尝试访问 Index() 页面时,出现以下错误
An unhandled exception occurred while processing the request. NotImplementedException: The method or operation is not implemented. JSMApp.PaginatedList<T>.CreateAsync<TEntity>(IQueryable<TEntity> 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<Order> 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<Order>
;
PaginatedList<Order>.CreateAsync(orderData,pageNumber,5))
【讨论】:
请注意,您可以改为从匿名类型创建分页列表。但我认为您不能基于此定义视图模型。 谢谢你,但我运行出错,添加了错误的截图 什么是JAXSurplusMouseApp
?那是你的源代码吗?那么为什么你的 CreateAsync 方法抛出没有实现呢? (而且,不要将文本作为图像发布..)以上是关于未使用 EF 的视图的分页的主要内容,如果未能解决你的问题,请参考以下文章