PagedList, работающий с ViewModels и .Skip (). Take ()

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


person user1987392    schedule 16.01.2015    source источник


Ответы (1)


На самом деле это был случай RTFM, и я придумал решение, перечитывая документацию. когда я закончил со своим вопросом. Я все равно отправлю вопросы и ответы, так как они могут быть кому-то полезны в будущем.

Чтобы выполнить описанный выше сценарий, мне пришлось создать и вернуть _1 _.

В некоторых случаях у вас нет доступа к чему-либо, способному создавать IQueryable, например, при использовании метода GetAllUsers, встроенного в MembershipProvider .Net. Этот метод предлагает разбиение на страницы, но не через 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);
}
person user1987392    schedule 16.01.2015