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

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

  1. SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL

          SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...

  2. SQL Server 2000/2005 分页SQL — 单条SQL语句

    有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...

  3. 仿Orm 自动生成分页SQL

    分页的写法 自从用上了Orm,分页这种事就是腰不酸腿不痛了.不过有时候想用纯粹的ado.net来操作,希望返回的数据是原生的DataTable或DbDataReader类似的东西,故研究下怎么生成分页 ...

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

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...

  5. 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息

    现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...

  6. Microsoft SQL Server Version List(SQL Server 版本)

    原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Servic ...

  7. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  8. 开始使用 Docker (Linux 上运行 SQL Server) 上的 SQL Server 容器 - SQL Server | Microsoft Docs

    原文:开始使用 Docker (Linux 上运行 SQL Server) 上的 SQL Server 容器 - SQL Server | Microsoft Docs 快速入门:使用 Docker ...

  9. 【转】sql server数据库操作大全——常用语句/技巧集锦/经典语句

    本文为累计整理,有点乱,凑合着看吧! ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ☆ ☆ ☆ sql 宝 典 ☆ ☆ ☆ 2012年-8月 修订版 ☆ ...

随机推荐

  1. 用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)

    用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n). 该函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址 ...

  2. 7、RNAseq Downstream Analysis

    Created by Dennis C Wylie, last modified on Jun 29, 2015 Machine learning methods (including cluster ...

  3. 【机器学习】关联规则分析(一):Apriori

    一.Apriori原理 Apriori是关联分析中较早的一种方法,主要用来挖掘那些频繁项集合,其思想是: 1.如果一个项目集合不是频繁集合,那么任何包含它的项目(超集)也一定不是频繁集. 2.如果一个 ...

  4. javascript函数自执行里的this为什么指向window

    当你要确定“函数中的this是什么”的时候,永远不要到函数定义的地方去找答案!而是要到函数被调用的地方找答案! 具体说:函数里面的this的含义,是由它被调用的方式决定的. 换句话说,当你看到下面的代 ...

  5. Object.prototype.toString.call(arg)详解

    经常能碰到Object.prototype.toString.call对参数类型进行判断,一开始只知道怎么使用,却不了解具体实现的原理,最近恶补了一下相关知识,写个笔记加强理解,有什么不对的请指教. ...

  6. 《鸟哥的Linux私房菜》读书笔记5

    1.shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了; 2.shell script 其实就是纯文字文件 (ASCII) ,我们可以编辑这个档案, ...

  7. HTMLParser使用详解(2)- Node内容

    HTMLParser使用详解(2)- Node内容  2010-03-18 13:41 HTMLParser将解析过的信息留存为一个树的结构.Node是信息留存的数据类型基础.请看Node的界说:pu ...

  8. Loadrunner监控服务器资源

    LoadRunner 加载监听服务器的步骤如下: 1.在 LoadRunner Controller 下,将工作面板切换到 Run状态,Available Graphs 栏 ,System Resou ...

  9. Typography 文字排版

    标签的语义 1. 含语义的标签 2. 不含语义, 但是具有样式的class <h1></h1> <p class="h1"></p> ...

  10. java整理(三)

    1.继承性:继承已有的功能.使用extends关键字.class  子类   extends  父类{} 子类又被称为派生类,父类又被称为超类. 继承的限制: 1.java中,不允许多重继承,即一个子 ...