Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
在EF中,使用linq進行分頁是很方便的,假如我們有一個EMP表,結構如下:
public class Emp{[Key]public Guid No { get; set; }public int Age { get; set; }[Required][StringLength(50)]public string Name { get; set; }}?如果我們進行分頁的話,一般使用Skip和Take方法,這里一行最簡單的代碼如下:
mContext.Emp.OrderBy(emp => emp.Name).Skip(6).Take(3);?如果我們使用的是EF6,在使用Sql server 2008 r2及更早數據庫的時候,自動生成的Sql語句如下:
SELECT TOP (3) [Extent1].[No] AS [No], [Extent1].[Age] AS [Age], [Extent1].[Name] AS [Name]FROM ( SELECT [Extent1].[No] AS [No], [Extent1].[Age] AS [Age], [Extent1].[Name] AS [Name], row_number() OVER (ORDER BY [Extent1].[Name] ASC) AS [row_number]FROM [dbo].[Emp] AS [Extent1]) AS [Extent1]WHERE [Extent1].[row_number] > 6ORDER BY [Extent1].[Name] ASC?如果我們使用的是EF6,在使用Sql server 2012或2014數據庫的時候,自動生成的Sql語句如下:
SELECT [Extent1].[No] AS [No], [Extent1].[Age] AS [Age], [Extent1].[Name] AS [Name]FROM [dbo].[Emp] AS [Extent1]ORDER BY [Extent1].[Name] ASCOFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY?因為在 Sql server 2012及以后的數據庫中,提供了更高性能的分頁方法,就是使用OFFSET? ROWS FETCH NEXT? ?ROWS ONLY這幾個關鍵字,EF會根據數據庫的不同版本自動生成匹配的sql語句。
但是,在EF7beta7中,也許是bug的問題,始終按照FETCH NEXT???的方法來生成,具體如下:
使用EF7beta7,在使用Sql server 2008 r2及更早數據庫的時候,自動生成的Sql語句如下:
SELECT "emp"."No", "emp"."Age", "emp"."Name"FROM "Emp" AS "emp"ORDER BY "emp"."Name"OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY使用EF7beta7,在使用Sql server 2012或2014數據庫的時候,自動生成的Sql語句如下:
?
SELECT "emp"."No", "emp"."Age", "emp"."Name"FROM "Emp" AS "emp"ORDER BY "emp"."Name"OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY?也就是說,兩者生成的sql語句一樣,這樣就會出現問題,在使用Sql server 2008 r2及更早數據庫的時候,如果使用linq來分頁,就會出現錯誤。
簡單研究了一下,這個錯誤應該是在ef7源代碼中SqlServerQuerySqlGenerator類及其附屬類中產生的,希望在新的版本能解決這個問題。
轉載于:https://www.cnblogs.com/aspnet5/p/4855667.html
總結
以上是生活随笔為你收集整理的Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题的全部內容,希望文章能夠幫你解決所遇到的問題。