У меня есть действие в моем контроллере, чтобы получить список MyObjectViewModels
.
Внутри этого метода действия я вызываю метод (уровень сервиса), который выбирает соответствующие модели, применяя кучу 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 записей) таблицы с большим количеством данных?