2011-01-07 48 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