MVC Pager Wass - Assagination
-
30-09-2019 - |
Вопрос
Я мог бы ошибаться, но это метод assagination не очень неэффективным, так как он отсасывает все данные из репозитория сначала инициализации тоталемы и т. Д.? Таким образом, пейджинг не используется для создания доступа к данным более эффективным.
Я не нашел никаких примеров, которые используют репозиторий и «истинный» пейджинг (т. Е. Топ и т. Д. В атомном SQL). Как использовать Pager, если у меня есть метод репозитория с этой подписью:
Ilist getData (int? Страница, out int totalitems)
Любая отзыва была бы очень ценится. Спасибо.
Христианин
Решение
Вы могли бы использовать 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) %>
Другие советы
Я думаю, что вы можете быть неправильно направлены с вашими предположениями о эффективности пейджинга? Попробуйте взглянуть на выполнение SQL в Profiler - он выполняет два оператора SQL - один для извлечения подсчета и один, чтобы выбрать топ-10. Ниже приведены результаты выполненного SQL от Profiler -
Этот 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
Обратите внимание на верхнюю (10), row_number () и где ...> 20 утверждений во втором SQL Script? Это помогает уточнить?