PagedList使用ViewModels和.Skip()。Take()

时间:2015-01-16 10:54:26

标签: c# asp.net-mvc linq mvvm pagedlist

我的控制器中有一个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

1 个答案:

答案 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);
}