在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. linux日常管理-防火墙selinux

    关闭防火墙 SELINUX=disabled 可以是三种状态 # enforcing - SELinux security policy is enforced.打开# permissive - SE ...

  2. layui table中使用checkbox

    第一步: 1. <div class="layui-form"> <table class="layui-hide" lay-filter=& ...

  3. Entity Framework Code-First(10.3):Property Mappings

    Property Mappings using Fluent API: Here, we will learn how to configure properties of an entity cla ...

  4. 22.ThinkPHP5框架缺陷导致远程命令执行

    前言: 昨天爆出了ThinkPHP5框架缺陷导致远程命令执行,大佬们都赶上潮流挖洞,小白还是默默学习一下这个漏洞 漏洞影响范围: Thinkphp 5.1.0 - 5.1.31 Thinkphp 5. ...

  5. 7.31实习培训日志-docker sql

    docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...

  6. JS使用replace替换字符串中的某段或某个字符

    函数的介绍参考:http://www.w3school.com.cn/jsref/jsref_replace.asp 下列代码将Hello World!中的World替换为Jim <html&g ...

  7. C#面向对象三大特性之二:继承

    面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低了耦合. 但在实际应用中,有好多对象具有相同或者相似的属性,比如有一个对象 果树 ...

  8. LVM使用

    LVM框架 LVM实验环境准备 创建一个128MB的文件模拟磁盘 [centos@centos lvm]$ dd if=/dev/zero of=./disk.img count=128 bs=1MB ...

  9. HELLO---MVC

    前言 很荣幸有机会参加BS的项目,这个图书馆系统这个项目,需要用到ITOO框架,其中涉及到好多小框架的学习,MVC就是其中的一个学习知识点,像大家一样,刚刚接触一个新鲜的知识,心里除了恐惧还有就是茫然 ...

  10. 796D(bfs)

    题目链接: http://codeforces.com/problemset/problem/796/D 题意: 给出一颗 n 个节点树, 树枝连接的两个定点距离为 1, 树中有 k 个特殊点, 问最 ...