我可能错了,但AsPagination方法效率不是很低,因为它首先从存储库中提取所有数据以初始化TotalItems等?因此,不使用分页来提高数据访问效率。
我没有找到任何使用存储库和'true'分页的示例(即在atcual SQL中使用TOP等)。如果我有一个带有此签名的存储库方法,我该如何使用寻呼机:
IList GetData(int?page,out int TotalItems)
非常感谢任何反馈。感谢。
基督教
答案 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个语句?这有助于澄清吗?