2011-01-07 20 views
2

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

我还没有找到任何使用存储库和'真正'分页的例子(即在常用SQL中使用TOP等)。如何使用寻呼机,如果我有一个库方法与此签名:

的IList的GetData(INT页,OUT INT TOTALITEMS?)

任何反馈将是非常赞赏。谢谢。

基督教

回答

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) %> 
+0

非常感谢!将在星期一尝试。 – cs0815 2011-01-08 08:40:29

3

我想你可能会被误导你的关于寻呼效率的假设?尝试看看在执行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 

通知顶部(10),ROW_NUMBER(,并且其中... >第二个sql脚本中有20条语句?这有助于澄清?

+0

我想这取决于你的数据访问如何工作。但我见过很多这样的例子:repository.GetAll()。AsPagination(page ?? 1,10);所以我想说的是,他们得到的所有数据,然后切片/页面是非常低效的。但是,使用自定义分页我可以很容易地建立一个依赖关系(就页码而言)。 – cs0815 2011-01-13 08:58:30