我可能错了,但是 AsPagination 方法不是效率很低,因为它首先从存储库中吸取所有数据来初始化 TotalItems 等?所以不使用分页来提高数据访问的效率。
我没有找到任何使用存储库和“真实”分页的示例(即在 atcual SQL 中使用 TOP 等)。如果我有一个带有此签名的存储库方法,我该如何使用寻呼机:
IList GetData(int?page, out int TotalItems)
任何反馈将不胜感激。谢谢。
基督教
我可能错了,但是 AsPagination 方法不是效率很低,因为它首先从存储库中吸取所有数据来初始化 TotalItems 等?所以不使用分页来提高数据访问的效率。
我没有找到任何使用存储库和“真实”分页的示例(即在 atcual SQL 中使用 TOP 等)。如果我有一个带有此签名的存储库方法,我该如何使用寻呼机:
IList GetData(int?page, out int TotalItems)
任何反馈将不胜感激。谢谢。
基督教
您可以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) %>
我认为您对分页效率的假设可能会误导您?尝试查看分析器中正在执行的 sql - 它执行两个 sql 语句 - 一个用于检索计数,一个用于选择前 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
注意第二个 sql 脚本中的 TOP(10)、row_number() 以及 where ... > 20 语句?这有助于澄清吗?