我的控制器中有一个操作来获取MyObjectViewModels
列表。
在该 Action 方法中,我调用了一个方法(服务层),该方法通过应用一堆 LINQ
方法来获取相关模型并返回一个IQueryable<MyObject>
。
然后我对返回的IQueryable
进行一些排序,然后,理想情况下,我会在生成的IQueryable
中执行.Skip(...).Take(25)
,将其转换为 List,迭代 25 个MyObject
元素并将它们转换为我的 MyObjectViewModels
类。然后,我将返回带有这些视图模型的PagedList
:
public ActionResult MyAction(...parameters...)
{
// Supose this returns 100000 records...
IQueryable<MyObject> myObjs = _myService.GetMyObjects(...some params...);
// Sort and take only 25 (apply paging)
IQueryable<MyObject> mySortedAndPagedObjs = myObjs.OrderBy(...);
mySortedAndPagedObjs = mySortedAndPagedObjs.Skip(...).Take(25);
List<MyObject> myObjsList = mySortedAndPagedObjs.ToList();
List<MyObjectViewModel> myVMList = new List<MyObjectViewModel>();
// *** Conversion loop ***
foreach(MyObject myObj in myObjectList)
{
// ... convert the 25 MyObject to MyObjectViewModel
// and add them to the myVMList...
}
// Return a View with the PagedList
return View(myVMList.ToPagedList(pageNumber, pageSize));
// --> The PagedList will not "know" that it is looking at 25 records of a 100000 long list!
}
这似乎与PagedList.MVC方法不兼容,该方法期望ToPagedList()
方法接收整个对象集(不仅仅是25 - 我假设它在内部调用.Skip().Take()
调用本身)。但是,这将迫使我将该转换循环应用于整个MyObject集(!!),而我宁愿一次只为我想返回的25个项目执行此操作...
如何让我的PagedList
显示从包含大量数据的表的子集(例如 25 条记录)中选择的ViewModels
?
这实际上是RTFM的一个案例,当我完成问题时,当我重新阅读文档时,我想出了解决方案。无论如何,我都会发布问答,因为它将来可能对某人有用。
为了完成上述方案,我必须创建并返回一个StaticPagedList
。
在某些情况下,您无法访问能够创建 智商,如使用时。Net的内置会员提供商的 获取所有用户方法。此方法提供分页,但不是通过 IQueryable 提供的。 幸运的是,PagedList仍然支持您(注意使用。 静态分页列表):
就我而言,这意味着:
public ActionResult MyAction(...parameters...)
{
// ... same as above ...
// Create a StaticPagedList
StaticPagedList<MyObjectViewModel> staticPagedList = new StaticPagedList<MyObjectViewModel>(myVMList , pageNumber + 1, pageSize, myObjs.Count());
// Return a View with the StaticPagedList
return View(myStaticPagedList);
}