2

我可能错了,但是 AsPagination 方法不是效率很低,因为它首先从存储库中吸取所有数据来初始化 TotalItems 等?所以不使用分页来提高数据访问的效率。

我没有找到任何使用存储库和“真实”分页的示例(即在 atcual SQL 中使用 TOP 等)。如果我有一个带有此签名的存储库方法,我该如何使用寻呼机:

IList GetData(int?page, out int TotalItems)

任何反馈将不胜感激。谢谢。

基督教

4

2 回答 2

6

您可以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) %>
于 2011-01-08T08:28:42.340 回答
3

我认为您对分页效率的假设可能会误导您?尝试查看分析器中正在执行的 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

注意第二个 sql 脚本中的 TOP(10)、row_number() 以及 where ... > 20 语句?这有助于澄清吗?

于 2011-01-12T12:01:37.267 回答