mvc contrib pager вопрос - AsPagination - PullRequest
2 голосов
/ 07 января 2011

Я могу ошибаться, но разве метод AsPagination не очень неэффективен, поскольку он сначала высасывает все данные из хранилища для инициализации TotalItems и т. Д. Поэтому подкачка страниц не используется для повышения эффективности доступа к данным.

Я не нашел ни одного примера, который бы использовал репозиторий и «истинный» пейджинг (т. Е. Использует TOP и т. Д. В обычном SQL). Как использовать пейджер, если у меня есть метод репозитория с такой подписью:

IList GetData (int? Page, out int TotalItems)

Любая обратная связь будет принята с благодарностью. Спасибо.

Christian

Ответы [ 2 ]

6 голосов
/ 08 января 2011

Вы можете использовать класс CustomPagination<T>, который является частью MVCContrib, следующим образом:

public ActionResult Index(int page)
{
    int totalItems;
    int pageSize = 10;
    var data = Repository.GetData(page, out totalItems);
    var paginatedData = new CustomPagination<Bla>(
        data, page, pageSize, totalItems
    );
    return View(paginatedData);
}

и внутри вашего вида:

<%= Html.Pager(Model) %>
3 голосов
/ 12 января 2011

Думаю, вы ошиблись своими предположениями об эффективности подкачки?Попробуйте взглянуть на выполнение SQL в профилировщике - он выполняет два оператора SQL - один, чтобы получить счетчик и один, чтобы выбрать топ 10. Ниже приведены результаты выполненного SQL от профилировщика -

Этот SQL получаетполучает счетчик - используется пейджером:

SELECT [GroupBy1].[A1] AS [C1]
FROM ( SELECT 
   COUNT(1) AS [A1]
   FROM [dbo].[Customer] AS [Extent1]
)
AS [GroupBy1]

В то время как SQL используется для извлечения данных:

SELECT TOP (10) 
[Extent1].[CustomerId] AS [CustomerId], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName],
...
FROM ( SELECT [Extent1].[CustomerId] AS [CustomerId], [Extent1].[FirstName] AS [FirstName], [Extent1].[LastName] AS [LastName], ..., row_number() OVER (ORDER BY [Extent1].[Company] ASC) AS [row_number]
    FROM [dbo].[Customer] AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 20
ORDER BY [Extent1].[Company] ASC

Обратите внимание на TOP (10), row_number () над, а где ...> 20 операторов во втором sql скрипте?Это помогает уточнить?

...