现在的位置: 首页 > 综合 > 正文

[ASP.NET2.0]Repeater C# 分页用法的效率及简单优化(不使用存储过程)

2013年04月25日 ⁄ 综合 ⁄ 共 1999字 ⁄ 字号 评论关闭

 文中http://www.cnblogs.com/xiediy/archive/2008/09/09/1287567.html讲述了Repeater在C Sharp 中的分页方式,我自己在三层架构(大致结构如下)中测试了一下。

三层架构:

1、DAL:封装了SELECT * FROM table事务(1)。

2、BLL:用GetAll()方法封装了对DAL的事务(1)的访问,并返回一个List<Object>。

3、View:通过Repeater遍历出来。

 

其中:objPage.DataSource
=
ds.Tables[
"
testTable
"
].DefaultView;


修改为:objPage.DataSource = tableBLL.GetAll();

 

测试的结果表示,在Controller(*.aspx.cs)中按上一篇文中的方法定义,空间并不会自动帮你填充Limit条件(如TOP N等),而是不加修改的原封不动地调用你的封装好的方法,原封不动地执行(SELECT * FROM table)获取表的所有数据,就是说,Repeater只会对你返回的结果进行截断处理,就是从数据库中查询所有记录,抽取N条显示在表现层。毋庸置疑,这个效率是很低的。当数据海量时,可以想象这样一次查询的数据量传输占用了多少带宽,还有你的服务器内存。

当你看懂了《[ASP.NET2.0]Repeater C# 分页用法》,其实对这个进行简单的优化也就不难了。只要把GetAll()修改为GetAll(int From , int To),相应改变里面的逻辑便可。具体的分页逻辑,建议用一个PageUtil的辅助类单独封装起来。

 

关于SQL 2005分页查询,从网上截取到一下内容,请参考

http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51819.html

Microsoft
SQL Server 2005 查询分页

微软新的SQL Server
2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程。
新的数据库分页功能的核心是一个叫row_number的函数
具体如下:

返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法
 
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ]
<order_by_clause> )

备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数
<partition_by_clause>

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。

有关详细信息,请参阅 OVER 子句 (Transact-SQL)。

返回类型
bigint

示例
以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。

 复制代码
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName,
ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD,
a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on
s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID =
c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0

以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。

 复制代码
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT
SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as
RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders

WHERE RowNumber between 50 and
60; 

==============================
进过我对百万行数据记录的分页测试,效率比以前网上能够找到的最好的存储过程(个人意见)稍高。
但是还是比同样的Oralce的分页效率低。

 

最后我总结一下,如果想查找按ID排的10~20行的记录,可以这么写:

SELECT *
FROM

(

SELECT ROW_NUMBER() OVER (order by ID) AS rowNum,
*
FROM table

)

AS a
WHERE a.rowNum>= 10 AND a.rowNum<=20

抱歉!评论已关闭.