使用自定义分页创建记录“网格”时,使用C#查询记录总数以及记录起始端的最佳/最佳方式是什么?
返回分页记录集的SQL:
SELECT Some, Columns, Here FROM (
SELECT ROW_NUMBER() OVER (ORDER BY Column ASC) AS RowId, *
FROM
Records
WHERE
(...)
) AS tbl
WHERE ((RowId > @Offset) AND (RowId <= (@Offset + @PageSize)) )
用于计算记录总数的SQL:
SELECT COUNT(*) FROM Records WHERE (...)
现在,我两次前往服务器:一次是获取记录,另一次是计算记录总数。
组合这些查询以避免多次数据库迁移的最佳方式是什么?
答案 0 :(得分:2)
您可以将存储过程与输出参数(或返回值)一起使用以传递总行数。
create procedure dbo.Stuff_GetAll (
@StartRowIndex int, -- zero based
@MaximumRows int
)
as
begin
declare @TotalRows int
select @TotalRows = count(*)
...
if (@TotalRows > 0 and @MaximumRows > 0)
begin
;with T as (
select *, row_number() over ()
...
)
select T.* from T
where Row between @StartRowIndex + 1 and (@StartRowIndex + @MaximumRows)
end
return @TotalRows
end
GO
您可能只想在请求第一页时查询count()(可能非常昂贵)。
答案 1 :(得分:2)
我找到的最快的方法是返回结果集中的行数:
With PagedItems As
(
Select ...
, ROW_NUMBER() OVER ( ORDER BY Column ASC ) As Seq
, ROW_NUMBER() OVER ( ORDER BY Column DESC ) As ReverseSeq
From Table
Where ....
)
Select ..., ( ReverseSeq + Seq - 1) As TotalRows
From PagedItems
Where RowId > @Offeset
ANd RowId <= ( @Offset + @PageSize )
答案 2 :(得分:0)
一种方法是将查询转换为存储过程,然后使用输出参数来计算总记录数。您将在过程中填充输出参数,然后以与现在相同的方式返回记录集。