c# - 在 sql for asp.net gridview 中使用 ROW_NUMBER() 自定义分页

标签 c# asp.net sql sql-server gridview

我正在尝试在 sql 中使用 ROW_NUMBER() 在 asp.net 中为 gridview 实现自定义分页。下面的(经典)查询效果很好,但是它的性能不是很好,因为我必须将整个表复制到一个新表,然后从新表中选择 20 条记录。它有时甚至在没有分页的情况下工作得更好,只需一次检索所有记录。我试图在 where 子句中使用 ROW_NUMBER() 但 sql 不允许我这样做。我怎样才能改进下面的查询?你有什么建议?我想我需要找到一种方法来消除将整个数据集复制到新表的过程,但是怎么做呢?

SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   

INTO #Results   
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 

ORDER BY LastUpdateDateTime DESC

-----------------------------------------------------


SELECT * FROM #Results
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results

最佳答案

对于这种简单的操作,您真的不需要使用临时表,只需使用子查询或 CTE。

使用子查询

SELECT * 
FROM (
SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
) Sub
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

使用 CTE

;WITH CTE
AS
 (
    SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row     
    FROM   Posts
    WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
 )
SELECT * 
FROM CTE
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

关于c# - 在 sql for asp.net gridview 中使用 ROW_NUMBER() 自定义分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22438451/

相关文章:

c# - 在 C# 测试中从 Json 文件中读取和映射数据

c# - 我应该使这个 XmlSerializer 静态吗?

c# - 如何在 "boolean conditional statement"中进行循环?

c# - ASP.NET 中的自动填充文本框取决于在另一个文本框中键入的文本

mysql - 错误 1833 (HY000) : Cannot change column MySQL

WHERE 子句 MySQL 中的 PHP 字符串变量

c# - 代码不断吃内存

asp.net - 如何将 "Users"集成到我的 DDD 模型中并验证用户身份?

asp.net - .net vNext Fedora 问题

sql - Oracle 9i SQL查询-多次连接同一个表