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

PagedList working with ViewModels and .Skip().Take()

我的控制器中有一个操作来获取 MyObjectViewModels 的列表。

在该 Action 方法中,我调用了一个方法(服务层),该方法通过应用一堆 LINQ 方法和 returns IQueryable<MyObject>.[=25 来获取相关模型=]

然后我对 returned IQueryable 进行一些排序,然后,理想情况下,我会在结果 IQueryable 中执行 .Skip(...).Take(25),将其转换为列出,遍历25个MyObject个元素,转换成我的MyObjectViewModelsclass。然后我会 return 一个 PagedList 和那些 ViewModels:

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 (!!) 集上应用该转换循环,而我宁愿一次只对我想要 return 的 25 个项目执行此操作...

如何让我的 PagedList 显示从具有大量数据的 table 的子集(例如 25 条记录)中选择的 ViewModels

这实际上是 RTFM 的一个案例,我在完成问题后重新阅读文档时想出了解决方案。无论如何我都会 post 问答,因为它可能对将来的人有用。

为了完成上述场景,我必须创建 return 一个 StaticPagedList

In some cases you do not have access something capable of creating an IQueryable, such as when using .Net's built-in MembershipProvider's GetAllUsers method. This method offers paging, but not via IQueryable. Luckily PagedList still has your back (note the use of 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);
}