2

私は間違っているかもしれませんが、TotalItems などを初期化するために最初にリポジトリからすべてのデータを吸い込むため、AsPagination メソッドはあまり効率的ではありませんか? そのため、データ アクセスをより効率的にするためにページングは​​使用されません。

リポジトリと「真の」ページングを使用する例は見つかりませんでした (つまり、atcual SQL で TOP などを使用しています)。このシグネチャを持つリポジトリ メソッドがある場合、Pager を使用するにはどうすればよいですか。

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を見てみてください-2つのSQLステートメントを実行します-1つはカウントを取得し、もう1つはトップ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

TOP(10)、row_number()、および2番目のSQLスクリプトの...>20ステートメントに注意してください。それは明確にするのに役立ちますか?

于 2011-01-12T12:01:37.267 に答える