PagedList — способ использования не со всей коллекцией

У меня есть простое действие, в котором я делаю запрос к веб-службе, чтобы получить СПИСОК статей для определенной группы.

Затем, используя pagedList (и указав нужную страницу и номер страницы), я, конечно, указываю подмножество этого списка, которое я хочу взять. Проблема в том, что статья для конкретной группы может быть, например, тысяча - и получение информации для всех из них из веб-сервиса занимает много времени, а иногда и сбои (когда статей больше 1000)

Есть ли способ получить статьи только для определенной страницы и по-прежнему использовать pagedList, потому что я вижу, что, к сожалению, мы должны вызывать метод ToPagedList для всей коллекции.

public virtual ActionResult ImportShow(String id, int? menuID, string articlegroupID, string menuforHistory,int? counter,int?page,int? pageSize,string articleDescr, int?  ArticleID)
        {



                List<WebServiceBeaMenu> standartList = ebServiceBea.GetArticle(Convert.ToInt32(menuID), articlegroupID, "", articleDescr);
                IPagedList<WebServiceBeaMenu> p_ProductsShow = standartList.ToPagedList(actualpage,actualPageSize);

                p_GroupMenu.ProductMenu = p_ProductsShow;
                p_GroupMenu.MenuHistory = p_GetMenuHistory.ToList();
                p_GroupMenu.MenuLeft = p_GetMenuLeft.ToList();
                return PartialView("ImportShow", p_GroupMenu);                 
            }
        }

вот мой взгляд

@model  MvcBeaWeb.GroupMenu



        @for (int i = 0; i < Model.ProductMenu.Count; i++)
        {

        <div>
            var item = Model.ProductMenu[i];



            @Html.PagedListPager(Model.ProductMenu, page => Url.Action("ImportShow", new { id = Model.LanguageName, menuID = @Session["men"], articlegroupID = Session["article"], articleDescr = Session["articleDescr"], pageSize = Session["pageSize"], page }))

    </div>

person Tania Marinova    schedule 28.11.2014    source источник
comment
Я не думаю, что это возможно, потому что список страниц действует на весь список. Что вы можете сделать, так это изменить свой вызов базы данных, чтобы получить только тот набор статей, который вы хотите показать.   -  person AnotherGeek    schedule 28.11.2014
comment
Если вы используете ef или linq2sql, вы можете вернуть IQueryable и сделать список страниц поверх этого. Это позволит не выбирать все сначала.   -  person Jamie    schedule 28.11.2014


Ответы (1)


Вы должны переписать .GetArticle() или заменить его чем-то вроде .GetPagedArticle(), если у вас есть доступ к WebService. Этот метод должен иметь все параметры подкачки. Это единственный способ, которым я думаю. Ваш метод .GetArticle() должен возвращать такой объект:

public class Set<T>
{
    public Set()
    {
        Elements = new List<T>();
    }

    public Set(List<T> elements, int rowsAll)
    {
        Elements = elements;
        RowsAll = rowsAll;
    }

    public Set(List<T> elements, int rowsOnPage, int pageSelected, int rowsAll)
    {
        Elements = elements;
        PageSelected = pageSelected;
        RowsOnPage = rowsOnPage;
        RowsAll = rowsAll;
        PagesAll = (rowsAll % RowsOnPage == 0) ? rowsAll / RowsOnPage : rowsAll / RowsOnPage + 1; ;
    }
    public int RowsOnPage { get; set; }
    public List<T> Elements { get; set; }
    public int? RowsAll { get; set; }
    public int PageSelected { get; set; }
    public int PagesAll { get; set; }
}

Где Elements должны быть не все элементы, а только выгружаемый.

person teo van kot    schedule 28.11.2014
comment
ОК для GetArticle — я получу только статьи для этой страницы. Но тогда TopagedList хочет целую коллекцию со всеми продуктами (полагаю, таким образом он определяет страницы и их логику), и у меня нет такого списка IPagedList‹WebServiceBeaMenu› p_ProductsShow = standartList.ToPagedList(actualpage,actualPageSize); - person Tania Marinova; 01.12.2014
comment
Я не понимаю этот комментарий. Я имею в виду, что вы должны передать параметры actualpage и actualPageSize в метод GetArticle(). И делайте разбиение на страницы там - в WebService. Если вы можете изменить этот метод и сделать это правильно, это поможет вам. Еще одна возможность, которую @Jamie упоминает в своем комментарии, заключается в том, что вы можете получить из GetArticle() не List, а IQueryable коллекцию и работать не со всеми элементами, а с Query в вашем методе ToPagedList() - person teo van kot; 01.12.2014
comment
Хорошо, я передаю параметры фактической страницы и фактического размера страницы в метод GetArticle(). а это значит, что например я получу информацию для десяти статей из 100 например. Я спрашиваю, как pagedList узнает, что общее количество статей равно 100, чтобы он мог, например, отрисовывать страницы. - person Tania Marinova; 01.12.2014
comment
А, теперь я понял. Вы должны использовать класс с полем TotalRows и собирать текущие выгружаемые строки. Я обновляю ответ примером того, что я использую для этой цели в своих проектах. - person teo van kot; 01.12.2014
comment
Спасибо ; Я придумал такое же решение. Я думаю, что оно единственное. - person Tania Marinova; 01.12.2014