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] > 6
    ORDER 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] ASC
    OFFSET 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类及其附属类中产生的,希望在新的版本能解决这个问题。

时间: 2024-10-12 21:09:53

Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题的相关文章

理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最初关注点中:为什么语句在应用程序中慢,但是在SSMS中快?到目前为止,都是在说存储过程的情况.而存储过程的问题通常是因为SET ARITHABORT的不同设置项的原因.如果你的应用不使用存储过程,而是通过中间层提交客户端的查询,那么也有几个原因可能让你的查询因为不同的缓存条目从而使得在SSMS和应用程序中的运

Microsoft SQL Server Version List(SQL Server 版本)

原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Service Packs (SP), Cumulative Updates (CU), patches, hotfixes and other builds of MS SQL Server 2014, 2012, 2008 R2, 2008, 2005, 2000, 7.0, 6.5 and 6.0 tha

SSMA迁移本地的MY SQL到本地SQL server及windows azure SQL Databaase

说到数据库,很多人都会想到MY Sql.SQL Server及oracle等等,同时很都人首选MY SQL,因为MY SQL是免费的,而且数据包也比较小,安装快捷方便,而SQL Server是收费的,是微软的产品,收费相当高,一般很少用,除非大数据,当然在资金满足的情况下会选择oracle数据库了,这些我就不具体说了,今天呢,我们主要介绍一下如何将本地的MY SQL数据迁移到SQL Serrver下,不管什么服务,迁移数据是最痛苦的事了,那有没有一种比较智能的方法做迁移呢,答案那是必须的,那是什

SQL SERVER 2012链接到SQL SERVER 2000的问题解决案例

前几天在在桦仔的SQLSERVER走起微信公众帐号看到一篇文章MS SQL Server2014链接MS SQL Server 2000,当时手机上囫囵吞枣看了个大概,知道是由于SQL SERVER Native Client版本问题,没想到不过几天,自己就一脚踩到这个坑里面了,真是感概万千,下文主要讲述一下SQL SERVER Native Client 10的安装过程. 网上搜索SQL SERVER Native Client 10的下载地址,搜索到一堆乱七八糟的地址.没有看到官网的下载地址

SQL Server索引简介:SQL Server索引级别1

作者David Durant,2014/11/05(第一版:2011/02/17) 原文链接: http://www.sqlservercentral.com/articles/Stairway+Series/72284/ 该系列 本文是"Stairway系列:SQL Server索引的阶梯"的一部分 索引是数据库设计的基础,并告诉开发人员使用数据库关于设计者的意图.不幸的是,当性能问题出现时,索引往往被添加为事后考虑.这里最后是一个简单的系列文章,应该使他们快速地使任何数据库专业人员

[翻译]——SQL Server索引的介绍:SQL Server索引级的阶梯

SQL Server索引的介绍:SQL Server索引级的阶梯 By David Durant, 2014/11/05 (first published: 2011/02/17) 该系列 本文是楼梯系列的一部分:SQL Server索引的阶梯 索引是数据库设计的基础,并告诉开发人员使用数据库非常了解设计器的意图.不幸的是,当性能问题出现时,索引常常被添加到事后.这里最后是一个简单的系列文章,它应该能让任何数据库专业人员快速"跟上"他们的步伐 第一个层次引入了SQL Server索引:

.NET Core EF框架使用SQL server 2008数据库分页问题:Incorrect syntax near &#39;OFFSET&#39;. Invalid usage of the option NEXT in the FETCH statement

一. 问题 最近.Net Core程序部署到服务器,采用EF6.本地数据库是SQL server 2016,服务器数据库安装的是SQL server 2008 R2,在用到分页查询时报错如下: { "Depth": 0, "ClassName": "", "Message": "Incorrect syntax near 'OFFSET'.\r\nInvalid usage of the option NEXT in

Powerdesigner逆向工程从sql server数据库生成pdm【转】

Powerdesigner逆向工程从sql server数据库生成pdm 第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击"添加" 第四步:选择"sqlserver" 点击"完成" 第五步:跟据自身的情况填写 说明: 名称和描述可以自己命名,服务器就是你的数据库地址(下图) 第六步:填写好登录名和

统计分析SQL Server Profiler 跟踪的SQL

--跟踪文件读入到表中分析 SELECT * INTO ZGSJY FROM fn_trace_gettable('E:\wxxcdbprofiler.trc', default); --某时间内,最耗时SQL select TOP 100 SUBSTRING(Textdata,1,660) as '名称', count(*) as '数量', sum(duration/1000) as '总运行时间ms', avg(duration/1000) as '平均运行时间ms', avg(cpu)