EntityFrameWork使用MySql数据库分页的BUG
环境
使用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的更多相关文章
- MVC3、如何应用EntityFramework 连接MySql 数据库
原文:MVC3.如何应用EntityFramework 连接MySql 数据库 新的一年,新的开始. 今天总结的主题是在MySql中应用EntityFramework 的Code First模式. 开 ...
- Statement和PreparedStatement的特点 MySQL数据库分页 存取大对象 批处理 获取数据库主键值
1 Statement和PreparedStatement的特点 a)对于创建和删除表或数据库,我们可以使用executeUpdate(),该方法返回0,表示未影向表中任何记录 b)对于创建和 ...
- 使用ABP EntityFramework连接MySQL数据库
ASP.NET Boilerplate(简称ABP)是在.Net平台下一个很流行的DDD框架,该框架已经为我们提供了大量的函数,非常方便与搭建企业应用. 关于这个框架的介绍我就不多说,有兴趣的可以参见 ...
- oracle sqlserver mysql数据库分页
1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM tabl ...
- MySQL 数据库 分页查询
在使用MySQL 进行数据库分页查询的时候最主要是使用LIMIT子句进行查询: 首先来看一下LIMIT: LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两 ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...
- 【MySQL数据库】一些bug的解决
往往碰到mysql配置好后,第二天就登不上,也运行不了服务. 在cmd中输入 net start mysql 报mysql无法启动系统错误1067等 解决方案: 以前搞到最后没办法,重装了,后来找到 ...
- mysql数据库分页查询优化
原博:MySQL单表百万数据记录分页性能优化 limit优化 当数据很多需要进行分页查询时:需要先查出第一条数据的id然后根据id查询大于id的数据 limt 一页的数据量 1. 直接用limit ...
- Mysql数据库分页查询
为什么使用分页查询: 数据量比较大时,如果全部查询,展示刚给用户,数据量太大,用户难以接受.并且数据量大,查询慢.如果此时将大量的数据读取到java内存中,可能会存储崩溃. 分页查询的方式: 1.全部 ...
随机推荐
- Mac OS下基于Eclipse的Android调试环境搭建
1.安装Eclipse:http://www.eclipse.org/downloads/,网页会自动检测适用的版本(Mac OS x64),下载“Eclipse IDE for java Devel ...
- java连接mysql步骤
转自:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html JDBC连接mysql数据库 •创建一个以JDBC连接数据库的程 ...
- iTunes
我们的电脑都要下载比较好的显卡那项 https://support.apple.com/zh_CN/downloads/itunes
- git github简单知识
Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 .git 文件夹,.git 文件夹里存储了所有的版本信息.标记等内容 git remo ...
- HTML转移字符对照表
body { margin: 0; padding: 0; background: #FFF; color: #000; font-family: "宋体", arial; fon ...
- 小结一下前段时间做的rpgdemo
虽然说已经是彻底放弃继续做那个demo了(代码结构混乱,想增加新功能非常的不方便),不过还是花了一点心血在里面的,毕竟这是我开始学习unity游戏制作的初衷,不过果然是学的越多越发现自己的不足... ...
- Java Programming Language Enhancements
引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...
- mac os 禁止apache httpd自动启动(转)
mac os 禁止apache httpd自动启动 博客分类: 计算机使用 mac os不像linux有/etc/init.d/rc.local以及service的方式可以设置程序随机启动,而是使 ...
- PB-日志-系统函数2.13.7Match()、MatchW()
---恢复内容开始--- Match() 功 能:确定字符串中是否包含指定模式的字符. 语 法:Match ( string, textpattern ) 参 数:string:string类型,指定 ...
- 做Adsense的一些经验
The payment you receive per click depends on how much advertisers are paying per click to advertise ...