程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> 數據庫組件 Hxj.Data (二十) (分頁)

數據庫組件 Hxj.Data (二十) (分頁)

編輯:ASP技巧

分頁在前面好幾節中的列子中已經出現,現在在詳細講解一下。

有三種方法去實現:

1、Top(int topCount) 方法

在sqlserver和msAccess中其實就是top , 在Oracle通過rownum實現。

 

2、From(int startIndex, int endIndex)

從startIndex條到endIndex條之間的記錄數。

 

3、Page(int pageSize, int pageIndex)

每頁pageSize條,第pageIndex頁

 

下面就依次對這三個方法舉例說明。

 

top方法:

Dbsession.Default.From<PRoducts>()
                .Top(10)
                .ToList();該查詢時查詢products表中的前10條記錄,生成的sql語句如下:(如何輸出查看組件生成的sql)

Text: SELECT TOP 10 * FROM [Products] 

from方法:
DbSession.Default.From<Products>()
                .From(3, 8)
                .ToList();查找第3條到第8條的數據(包括第3條和第8條),生成的sql語句如下:

Text: SELECT * FROM ( SELECT TOP 6 * FROM ( SELECT TOP 8 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC 

page方法:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .ToList();查詢每頁10條的第2頁數據,sql語句如下:
Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[ProductID] ASC) AS tempIntable ORDER BY [ProductID] DESC) AS tempOuttable ORDER BY [ProductID] ASC

可以看出from方法和page方法生成的sql語句是格式是一樣的,其實page方法最終還是調用from方法,
如果from的startIndex參數等於1就會調用top方法來查詢。

默認情況下我們並沒有設置排序,組件則會自動添加一個排序,如果有主鍵則選主鍵排序,不然選一個其他列排序。

當然在很多情況下我們是需要設置哪些列排序的。
例如:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                .Where(Products._.CategoryID == 2)
                .ToList();查詢條件是categoryid等於2,按照unitprice倒敘排序,每頁10條的第2頁數據。
生成的sql如下:
Text: SELECT * FROM ( SELECT TOP 2 * FROM [Products] WHERE [Products].[CategoryID] = @bee7551993404c8592f07f9b01710bb5 ORDER BY [Products].[UnitPrice] ASC) AS temp_table ORDER BY [UnitPrice] DESC Parameters: @bee7551993404c8592f07f9b01710bb5[Int32] = 2 這樣的sql語句是不是出乎意料啊,原來符合條件的查詢第二頁只有2條數據,所以查詢的時候就直接unitprice正序top 2就完結了。

我們把條件去掉再看看:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                //.Where(Products._.CategoryID == 2)
                .ToList();生成的sql如下:
Text: SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM [Products] ORDER BY [Products].[UnitPrice] DESC) AS tempIntable ORDER BY [UnitPrice] ASC) AS tempOuttable ORDER BY [UnitPrice] DESC 這樣算是正常的生成格式了。

以上的sql腳本都是在SQL Server2000下生成的。

其實在查詢過程中組建還會自動查詢了count()符合條件的記錄數,所以在大數據的情況下,效率不會很好。

如果你設置組建的數據庫是SQL Server2005則不會去查詢 count,而是直接通過row_number()來查詢,來獲得更好的效率。(Oracle則是rownum實現)

下面來SQL Server2005例子:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                //.Where(Products._.CategoryID == 2)
                .ToList();代碼還是上面的例子的,生成的sql:
Text: SELECT * FROM ( SELECT *,row_number() over( ORDER BY [Products].[UnitPrice] DESC) AS tmp__rowid FROM [Products] ) AS tmp_table WHERE (tmp__rowid BETWEEN 11 AND 20) 方法的調用還是一樣的,所以如果from的參數startIndex等於1,還是優先使用top,並沒有使用row_numer()。


當然你覺得分頁還不夠理想,可以自己寫sql或者存儲過程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved