分頁在前面好幾節的列子中已經出現,現在在詳細講解一下。
有三種方法去實現:
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 BYProductDER]
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 temptemptable ORDER BYOutProduct
可以看出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正常的生成格式了。
以上的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或是預存程序。