使用视图模型和 的分页列表.跳过().Take()



我的控制器中有一个操作来获取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);
}

最新更新