PagedList работает с ViewModels и.Skip().Take()
У меня есть действие в моем контроллере, чтобы получить список MyObjectViewModels
,
Внутри этого метода Action я вызываю метод (уровень службы), который выбирает соответствующие модели, применяя набор LINQ
методы и возвращает IQueryable<MyObject>
,
Затем я делаю сортировку по возвращаемым IQueryable
а потом, в идеале, я бы выполнил .Skip(...).Take(25)
в результате IQueryable
, преобразовать его в список, перебрать 25 MyObject
элементы и преобразовать их в мой MyObjectViewModels
учебный класс. Я бы тогда вернул 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 (!!), когда я предпочел бы просто сделать это для 25 элементов, которые я хочу вернуть за раз...
Как я могу получить мой PagedList
показать ViewModels
выбрать из подмножества (например, 25 записей) таблицы с большим количеством данных?
1 ответ
На самом деле это был случай RTFM, и я придумал решение, когда перечитал документацию, когда закончил со своим вопросом. В любом случае я опубликую вопросы и ответы, так как это может быть полезно для кого-то в будущем.
Чтобы выполнить описанный выше сценарий, мне пришлось создать и вернуть StaticPagedList
,
В некоторых случаях у вас нет доступа к чему-либо, способному создать IQueryable, например, при использовании встроенного в.Net метода GetAllUsers MembershipProvider. Этот метод предлагает пейджинг, но не через 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);
}