国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

[ASP.NET2.0]Repeater C# 分頁用法的效率及簡單優(yōu)化(不使用存儲過程)

2019-11-17 04:07:05
字體:
供稿:網(wǎng)友
 文中http://m.survivalescaperooms.com/xiediy/archive/2008/09/09/1287567.html講述了Repeater在C Sharp 中的分頁方式,我自己在三層架構(gòu)(大致結(jié)構(gòu)如下)中測試了一下。

三層架構(gòu):

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();


測試的結(jié)果表示,在Controller(*.aspx.cs)中按上一篇文中的方法定義,空間并不會自動幫你填充Limit條件(如TOP N等),而是不加修改的原封不動地調(diào)用你的封裝好的方法,原封不動地執(zhí)行(SELECT * FROM table)獲取表的所有數(shù)據(jù),就是說,Repeater只會對你返回的結(jié)果進行截斷處理,就是從數(shù)據(jù)庫中查詢所有記錄,抽取N條顯示在表現(xiàn)層。毋庸置疑,這個效率是很低的。當數(shù)據(jù)海量時,可以想象這樣一次查詢的數(shù)據(jù)量傳輸占用了多少帶寬,還有你的服務器內(nèi)存。

當你看懂了《[asp.net2.0]Repeater C# 分頁用法》,其實對這個進行簡單的優(yōu)化也就不難了。只要把GetAll()修改為GetAll(int From , int To),相應改變里面的邏輯便可。具體的分頁邏輯,建議用一個PageUtil的輔助類單獨封裝起來。

關于SQL 2005分頁查詢,從網(wǎng)上截取到一下內(nèi)容,請參考 :

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

Microsoft SQL Server 2005 查詢分頁

微軟新的SQL Server 2005新增了數(shù)據(jù)庫分頁功能,以后再也用寫復雜不靈活而低效率的分頁存儲過程
新的數(shù)據(jù)庫分頁功能的核心是一個叫row_number的函數(shù)
具體如下:

返回結(jié)果集分區(qū)內(nèi)行的序列號,每個分區(qū)的第一行從 1 開始。

語法

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

備注
ORDER BY 子句可確定在特定分區(qū)中為行分配唯一 ROW_NUMBER 的順序。

參數(shù)
<partition_by_clause>

將 FROM 子句生成的結(jié)果集劃入應用了 ROW_NUMBER 函數(shù)的分區(qū)。

<order_by_clause>

確定將 ROW_NUMBER 值分配給分區(qū)中的行的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。

有關詳細信息,請參閱 OVER 子句 (Transact-SQL)。

返回類型
bigint

示例
以下示例將根據(jù)年初至今的銷售額,返回 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;

==============================
進過我對百萬行數(shù)據(jù)記錄的分頁測試,效率比以前網(wǎng)上能夠找到的最好的存儲過程(個人意見)稍高。
但是還是比同樣的Oralce的分頁效率低。

最后我總結(jié)一下,如果想查找按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 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黎川县| 大连市| 门源| 滕州市| 丽水市| 封开县| 桓台县| 贵定县| 龙海市| 公安县| 渭南市| 伊通| 弥勒县| 浪卡子县| 东乡| 大名县| 乐清市| 维西| 定西市| 城市| 巨野县| 沙田区| 全南县| 南木林县| 五常市| 恩施市| 曲靖市| 汽车| 九江市| 仙桃市| 信阳市| 普宁市| 贵定县| 临朐县| 通河县| 罗江县| 青铜峡市| 通州区| 曲周县| 奉新县| 金门县|