mvc contrib pager问题 - AsPagination

时间:2011-01-07 15:02:18

标签: asp.net-mvc mvccontrib mvccontrib-grid

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

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

IList GetData(int?page,out int TotalItems)

非常感谢任何反馈。感谢。

基督教

2 个答案:

答案 0 :(得分: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) %>

答案 1 :(得分:3)

我认为您可能会误导您对寻呼效率的假设?试着看看profiler中正在执行的sql - 它执行两个sql语句 - 一个用于检索计数,另一个用于选择前10个。下面是从profiler执行的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()结束,以及...&gt;第二个sql脚本中的20个语句?这有助于澄清吗?