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
个元素,转换成我的MyObjectViewModels
class。然后我会 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);
}
我的控制器中有一个操作来获取 MyObjectViewModels
的列表。
在该 Action 方法中,我调用了一个方法(服务层),该方法通过应用一堆 LINQ
方法和 returns IQueryable<MyObject>
.[=25 来获取相关模型=]
然后我对 returned IQueryable
进行一些排序,然后,理想情况下,我会在结果 IQueryable
中执行 .Skip(...).Take(25)
,将其转换为列出,遍历25个MyObject
个元素,转换成我的MyObjectViewModels
class。然后我会 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);
}