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

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:50:07
字體:
來源:轉載
供稿:網友
分頁在前面好幾節中的列子中已經出現,現在在詳細講解一下。

有三種方法去實現:

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或者存儲過程




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄄城县| 河曲县| 昌邑市| 左权县| 襄汾县| 肃南| 务川| 汶上县| 平定县| 宜兴市| 沙坪坝区| 陇西县| 上饶县| 会泽县| 收藏| 波密县| 宁强县| 石渠县| 吴川市| 双辽市| 黄大仙区| 大同市| 高唐县| 万全县| 益阳市| 清原| 兰考县| 丰都县| 潼南县| 武陟县| 洮南市| 含山县| 孝义市| 司法| 仲巴县| 溧阳市| 禹州市| 翁源县| 伊宁市| 隆林| 原平市|