环境

使用MySQL Connector NET 6.7.4+EF5.0+VS2010

问题描述

IQueryable<T>类型的Where方法和Skip或Take方法一起使用时,生成的SQL语句错误。

详细代码

首先定义一个Model

 public class User
{
public string Id { set; get; }
public string Name { set; get; }
}

运行如下程序,本意是要查询User表中Name包含"Test"的记录,并返回前10条:

 string Name = "Test";
var Data = db.Set<User>().Where<User>(o => o.Name.Contains(Name)).
OrderBy<User,string>(o=>o.Id).
Skip<User>().
Take<User>();

运行后抛出"执行命令定义时出错。有关详细信息,请参阅内部异常",调试发现生成的SQL如下:

 SELECT
`Project1`.`Id`,
`Project1`.`Name`
FROM `User` AS `Project1`
WHERE (LOCATE(@p__linq__0, `Extent1`.`Name`)) > 0
ORDER BY
`Project1`.`Id` ASC LIMIT 0,10

原来生成的SQL中根本就没有 Extent1 这个别名,所以查询的时候自然就报错误,将代码修改成这样(即将变量直接换成文字):

  var Data = db.Set<User>().Where<User>(o => o.Name.Contains("Test")).
OrderBy<User,string>(o=>o.Id).
Skip<User>().
Take<User>();

生成的SQL为:

 SELECT
`Extent1`.`Id`,
`Extent1`.`Name`
FROM `User` AS `Extent1`
WHERE `Extent1`.`Name` LIKE '%Test%'
ORDER BY
`Extent1`.`Id` ASC LIMIT 0,10

运行结果正常。

之后将数据源换成SQL Server数据库后 同样的写法也一切正常,不知道这是不是MySql.Data.Entity生成SQL的一个BUG

解决办法

抱着试试的态度,将Where方法放到Take方法后即:

 string Name = "Test";
var Data = db.Set<User>().OrderBy<User,string>(o=>o.Id).Skip<User>().Take<User>().Where<User>(o => o.Name.Contains(Name));

生成的SQL为:

 SELECT
`Project1`.`Id`,
`Project1`.`Name`
FROM (SELECT
`Extent1`.`Id`,
`Extent1`.`Name`
FROM `User` AS `Extent1`
WHERE (LOCATE(@p__linq__0, `Extent1`.`Name`)) > 0
ORDER BY
`Extent1`.`Id` ASC LIMIT 0,10) AS `Project1`
ORDER BY
`Project1`.`Id` ASC

Ok,运行,正常了。

EntityFrameWork使用MySql数据库分页的BUG的更多相关文章

  1. MVC3、如何应用EntityFramework 连接MySql 数据库

    原文:MVC3.如何应用EntityFramework 连接MySql 数据库 新的一年,新的开始. 今天总结的主题是在MySql中应用EntityFramework 的Code First模式. 开 ...

  2. Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值

    1 Statement和PreparedStatement的特点   a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录   b)对于创建和 ...

  3. 使用ABP EntityFramework连接MySQL数据库

    ASP.NET Boilerplate(简称ABP)是在.Net平台下一个很流行的DDD框架,该框架已经为我们提供了大量的函数,非常方便与搭建企业应用. 关于这个框架的介绍我就不多说,有兴趣的可以参见 ...

  4. oracle sqlserver mysql数据库分页

    1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...

  5. MySQL 数据库 分页查询

    在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询: 首先来看一下LIMIT: LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两 ...

  6. MySQL数据库罕见的BUG——Can't get hostname for your address

    在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...

  7. 【MySQL数据库】一些bug的解决

    往往碰到mysql配置好后,第二天就登不上,也运行不了服务. 在cmd中输入 net start mysql  报mysql无法启动系统错误1067等 解决方案: 以前搞到最后没办法,重装了,后来找到 ...

  8. mysql数据库分页查询优化

    原博:MySQL单表百万数据记录分页性能优化 limit优化 当数据很多需要进行分页查询时:需要先查出第一条数据的id然后根据id查询大于id的数据 limt 一页的数据量 1.   直接用limit ...

  9. Mysql数据库分页查询

    为什么使用分页查询: 数据量比较大时,如果全部查询,展示刚给用户,数据量太大,用户难以接受.并且数据量大,查询慢.如果此时将大量的数据读取到java内存中,可能会存储崩溃. 分页查询的方式: 1.全部 ...

随机推荐

  1. [MKRCVCD]Burning SDK report AddFile error

    在使用Pipe通信的使用,我使用GetProcessExitCode这个函数来获取返回值.而ExitCode的定义为DWORD DWORD的原型为unsigned long,在32位程序中,DWORD ...

  2. iOS_SourceTree忽略CocoaPods文件

    原文作者:iOS_MingXing 原文地址(CSDN):http://blog.csdn.net/ios_mingxing/article/details/51487344 (有更改) 忽略文件内容 ...

  3. sql获取时间

    SELECT CONVERT(varchar(10), getdate(), 120)--当前年月日,Example:2013-11-19 SELECT CONVERT(varchar(10), ge ...

  4. java内存详解

    二.JAVA中的内存模型 程序运行的时候,内存主要由以下部分组成: 堆:所有线程共享一个堆:存放的都是new 出来的对象:由垃圾回收器回收: 方法区:所有线程共享一个方法区:里面存放的内容有点杂,可以 ...

  5. CSU 1660 K-Cycle(dfs判断无向图中是否存在长度为K的环)

    题意:给你一个无向图,判断是否存在长度为K的环. 思路:dfs遍历以每一个点为起点是否存在长度为k的环.dfs(now,last,step)中的now表示当前点,last表示上一个访问的 点,step ...

  6. Masonry的使用

     1.//添加了这个宏,就不用带mas_前缀了 #define MAS_SHORTHAND //添加了这个宏,equalTo就等于mas_equalTo #define MAS_SHORYHAND_G ...

  7. 初涉java库--ArrayList

    我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...

  8. 设置bundle包中的默认语言

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d28f5a } span.s1 { } span.s2 { c ...

  9. 解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........

    这...................................................................... 我也是醉了 看不太懂,大神们求解............ ...

  10. GOLANG 变量

    语法格式 var    变量名    类型   类型:        可以是go语言内置的各种基本数据类型.复合数据类型,甚至是函数.方法.接口以及自定义类型. 声明变量会给变量设定零值.数值类型变量 ...