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

首頁 > 開發(fā) > 綜合 > 正文

數(shù)據(jù)庫組件 Hxj.Data

2024-07-21 02:45:12
字體:
供稿:網(wǎng)友
分頁在前面好幾節(jié)中的列子中已經(jīng)出現(xiàn),現(xiàn)在在詳細(xì)講解一下。

有三種方法去實(shí)現(xiàn):

1、Top(int topCount) 方法

在sqlserver和msaccess中其實(shí)就是top , 在Oracle通過rownum實(shí)現(xiàn)。



2、From(int startIndex, int endIndex)

從startIndex條到endIndex條之間的記錄數(shù)。



3、Page(int pageSize, int pageIndex)

每頁pageSize條,第pageIndex頁



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



top方法:

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

Text: SELECT TOP 10 * FROM [Products]  

from方法:
DbSession.Default.From<Products>()
                .From(3, 8)
                .ToList();查找第3條到第8條的數(shù)據(jù)(包括第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頁數(shù)據(jù),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語句是格式是一樣的,其實(shí)page方法最終還是調(diào)用from方法,
如果from的startIndex參數(shù)等于1就會(huì)調(diào)用top方法來查詢。

默認(rèn)情況下我們并沒有設(shè)置排序,組件則會(huì)自動(dòng)添加一個(gè)排序,如果有主鍵則選主鍵排序,不然選一個(gè)其他列排序。

當(dāng)然在很多情況下我們是需要設(shè)置哪些列排序的。
例如:
DbSession.Default.From<Products>()
                .Page(10, 2)
                .OrderBy(Products._.UnitPrice.Desc)
                .Where(Products._.CategoryID == 2)
                .ToList();查詢條件是categoryid等于2,按照unitprice倒敘排序,每頁10條的第2頁數(shù)據(jù)。
生成的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條數(shù)據(jù),所以查詢的時(shí)候就直接unitprice正序top 2就完結(jié)了。

我們把條件去掉再看看:
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下生成的。

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

如果你設(shè)置組建的數(shù)據(jù)庫是sql server2005則不會(huì)去查詢 count,而是直接通過row_number()來查詢,來獲得更好的效率。(oracle則是rownum實(shí)現(xiàn))

下面來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) 方法的調(diào)用還是一樣的,所以如果from的參數(shù)startIndex等于1,還是優(yōu)先使用top,并沒有使用row_numer()。


當(dāng)然你覺得分頁還不夠理想,可以自己寫sql或者存儲(chǔ)過程。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南充市| 伊金霍洛旗| 伊金霍洛旗| 临猗县| 韶关市| 徐州市| 平利县| 肇州县| 铜陵市| 仁布县| 揭东县| 长治市| 巴塘县| 丰原市| 区。| 阳原县| 舞阳县| 宁津县| 河北区| 长治市| 翁源县| 乌鲁木齐市| 普定县| 项城市| 伊宁县| 双牌县| 繁峙县| 沁阳市| 峨山| 遂平县| 江山市| 泸州市| 小金县| 金昌市| 建始县| 平度市| 达州市| 运城市| 康乐县| 沙雅县| 通渭县|