我的控制器中有一个Action来获取MyObjectViewModels
的列表。
在Action方法中,我调用一个方法(服务层),通过应用一堆LINQ
方法获取相关模型并返回IQueryable<MyObject>
。
然后我对返回的IQueryable
进行一些排序,之后,理想情况下,我会在生成的.Skip(...).Take(25)
中执行IQueryable
,将其转换为List,迭代25 { {1}}元素并将它们转换为我的MyObject
类。然后,我将返回MyObjectViewModels
与这些ViewModel:
PagedList
这似乎与PagedList.MVC方法不兼容,后者期望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!
}
方法接收整个对象集(不仅仅是25 - 我假设它在内部调用ToPagedList()
召唤本身)。然而,这会迫使我在整个MyObject(!!)集上应用转换循环,而我只想为我想要一次返回的25个项目执行...
如何让我的.Skip().Take()
显示从包含大量数据的表的子集(例如25条记录)中选择的PagedList
?
答案 0 :(得分:1)
这实际上是RTFM的情况,当我完成我的问题时,我重新阅读文档时提出了解决方案。无论如何,我会发布Q&amp; A,因为它可能对将来有用。
为了完成上述场景,我必须创建并返回StaticPagedList
。
在某些情况下,您无法访问能够创建的内容 IQueryable,例如使用.Net的内置MembershipProvider时 GetAllUsers方法。此方法提供分页,但不通过IQueryable。 幸运的是PagedList仍然有你的背(注意使用 StaticPagedList):
就我而言,这意味着:
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);
}