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
當然在很多情況下我們是需要設置哪些列排序的。 例如: 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 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()。