环境

使用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. c++错误——intermediate.manifest : general error c1010070很傻的错

    .\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...

  2. [课程设计]Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计)

    Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统 ...

  3. python之SQLAlchemy

    ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...

  4. C++多线程のpackage_task

    可以异步获取可调用对象的结果.

  5. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。

    最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...

  6. angular的ng-repeat使用

    ng-repeat是angular的一个指令,用来循环生成某些东西.常用的是拿到数据循环生成样式展示在视图中. <!--orderStatuses表示$scope传递的数据$scope.orde ...

  7. Latex环境安装

    安装latex环境 sudo apt-get install texlive-full 推荐使用texstudio编辑器,简单方便高效靠谱 sudo apt-get install texstudio ...

  8. UI进阶 跳转系统设置相关界面的方法

    跳转系统设置界面,例如提示用户打开定位.蓝牙或者WIFI,提醒用户打开推送或者位置权限等 在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个prefs值,如下图: 跳转系 ...

  9. 【转】使用:after清除浮动

    以前总是加一个<div sytle="clear:both"></div>来解决,但这样会增加无语义的标签,下面是用after伪类实现,兼容多种浏览器.cl ...

  10. 【干货】微信场景之H5页面制作免费工具大集合

    营销代有手段出,各领风骚数百天.要说现在哪些营销方式最能传播,屡屡刷爆朋友圈的H5页面肯定就是首当其冲的,提到H5页面,就立马想到"围住神经猫",上线微信朋友圈3天的时间便创造了用 ...