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.全部 ...
随机推荐
- Mysql索引的类型和优缺点
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.注:[1]索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢.每修改数据 ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- 学习Git的总结与体会
学习Git的总结 blog 第一次学习Git是完全按照廖雪峰老师的教程学习的,学的过程中基本上没有遇到什么问题,但是自己实际操作就问题不断了. 首先,还是按照惯例,来膜拜一下廖雪峰老师精简的教程知识吧 ...
- JavaScript 中 map、foreach、reduce 间的区别
一直对map.foreach.reduce这些函数很是生疏,今天看underscorejs时好好研究了一下,一研究我就更懵了,这不是一样嘛,都是遍历,所以我就去知乎找了一下,整理出了比较好的几个说法. ...
- 百度之星初赛2A 1001 ALL X(HDU 5690)
All X Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- NPOI 教程 - 2.1单元格合并
来源:http://liyingchun343333.blog.163.com/blog/static/3579731620091018212990/ 合并单元格在制作表格时很有用,比如说表格的标题就 ...
- jQuery学习笔记(二)jQuery中DOM操作
目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...
- TensorFlow白皮书
TensorFlow [1] is an interface for expressing machine learning algorithms, and an implementation for ...
- eclipse添加easyExport插件,打开本地文件
下载地址:https://github.com/samsonw/OpenExplorer/downloads 官方:http://sourceforge.net/projects/easystruts ...
- dom4j如何解析XML文件
最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...