分頁在前面好幾節中的列子中已經出現,現在在詳細講解一下。
有三種方法去實現:
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或者存儲過程。