告知是否有比请求更多的结果(分页)的最佳方法?

时间:2012-06-26 12:16:44

标签: c# sql pagination

我正在运行一个检索20行的查询(例如)。我想知道是否有21个,所以我可以相应地启用“下一页”按钮。目前我正在检索pageSize + 1并返回一个布尔值作为out参数,根据是否有21个(在这种情况下)检索到的行来分配它的值,但实际上只返回20作为List。这意味着我正在检索一个额外的,但我忽略了哪个不是理想的性能而且我不想运行计数(*)因为它是另一个查询。

注意:使用pageddatasource实际上不是一个选项,必须坚持使用rowlimit并开始行。

感谢您的任何建议。

6 个答案:

答案 0 :(得分:2)

2个查询:

  1. 结果页
  2. 然后总结果数
  3. 第一个查询将包含页面和页面大小,第二个将为您提供总行数。使用此信息,您可以计算总页数并将其显示给用户。

答案 1 :(得分:1)

您可以使用嵌套查询,如下所示:

 select    TOP 20 *,
           (select count(*) from tableName) as TotalCount
 from      tableName

然后每一行都有总列,所以你可以检查一下。

或者,您可以使用此语法,避免嵌套选择。当您有其他谓词时(在嵌套选择中不必重复),这将变得更加方便:

 select    TOP 20 *, count(*) over() as TotalCount
 from      tableName

答案 2 :(得分:1)

  1. 获取计数(*)一次。用它来显示页数。
  2. 每次用户点击页码时,都会获得20条记录

答案 3 :(得分:0)

我怀疑在相同的数据库访问中检索一个额外的行(21对20)在性能方面是微不足道的。

答案 4 :(得分:0)

试试这个

Select *,Row_Number .... as RowNo
into #Table
from Table

Select * 
from #Table
WHERE RowNo > @FirstRec AND RowNo < @LastRec

Select count(*)
from #Table

答案 5 :(得分:0)

这是一个使用row_number

–-Change these two variable to parameters of your
–-actual stored procedure

Declare @PageNumber int
Declare @PageSize int


–-Assume we need page 6 i.e. records from 51-60
Select @PageNumber=6
Select @PageSize=10


–-Select only those records which
–-fit into a single page
Select Top(@PageSize) * from
(
Select
RowID=ROW_NUMBER() OVER (ORDER BY Name),
ProductID,Name,ProductNumber,ListPrice,
TotalRows=Count(*) OVER() --Count all records
from Production.Product
) A
Where A.RowId > ((@PageNumber-1)*@PageSize)