背景:MySQL分页查询语句为

SELECT * FROM TABLE LIMIT 0,10;

一般页面还会获取总条数,这时候还需要一条查询总条数语句

SELECT COUNT(*) FROM TABLE LIMIT 0,10

这样数据库需要执行两次查询操作。MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的函数,FOUND_ROWS取得总条数。

SELECT SQL_CALC_FOUND_ROWS * FROM TABLE LIMIT 0,10;
SELECT FOUND_ROWS();

上面SQL语句虽然有两个结果集,但只查询一次数据库,可以提升效率。

在asp.net mvc项目中,ORM仅仅使用EF的话,处理两个结果集就有些复杂,下面这段代码可以解决

 /// <summary>
/// 获取分页数据以及总条数(EF获取多个数据集)
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="sql">SQL语句(分页查询+SELECT FOUND_ROWS查询)</param>
/// <param name="parameters">SQL参数</param>
/// <param name="db">数据库上下文</param>
/// <param name="queryData">返回数据</param>
/// <param name="rowCount">总行数</param>
/// <param name="needReturnTotal">是否需要返回总行数</param>
public void GetQueryDataAndRowCount<T>(string sql, List<MySqlParameter> parameters, DbContext db, out List<T> queryData, out int rowCount, bool needReturnTotal = true)
{
var data = new List<T>();
var count = ;
try
{
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = sql;
if (parameters.Count > )
{
cmd.Parameters.AddRange(parameters.ToArray());
}
db.Database.Connection.Open();
var reader = cmd.ExecuteReader();
if (reader.HasRows)
{
data = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reader).ToList();
if (needReturnTotal)
{
reader.NextResult();
count = ((IObjectContextAdapter)db).ObjectContext.Translate<int>(reader).FirstOrDefault();
}
}
}
finally
{
db.Database.Connection.Close();
}
queryData = data;
rowCount = count;
}

EF获取多个数据集以及MySQL分页数据查询优化的更多相关文章

  1. mysql 分页数据错乱

    最近在使用mysql 分页查询数据的时候发现返回的数据与预期的不一样,显示数据重复错乱. 在官方文档 有这样一句话 If multiple rows have identical values in ...

  2. 解决 MySQL 分页数据错乱重复

    前言 一天,小明兴匆匆的在通讯工具上说:这边线上出现了个奇怪的问题,麻烦 DBA 大大鉴定下,执行语句 select xx from table_name wheere xxx order by 字段 ...

  3. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  4. MySQL 分页数据错乱重复

    select xx from table_name wheere xxx order by 字段A limit offset;, 表数据总共 48 条,分页数量正常,但出现了结果混杂的情况,第一页的数 ...

  5. mysql大数据查询优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. MySQL百万数据查询优化

    问题来源: 在查询统计的业务中做了一个小型的每隔一分钟的统计服务,实现1分钟,5分钟,1小时,2小时,一天,三天,一月,3月,一年的级联统计.前期数据来源表数据,以及生成的统计表数据都少; 数月之后, ...

  7. MySql 分页

    MySql 分页 由于最近项目需要,于是就简单写了个分页查询.总体而言MySql 分页机制较为简单.数据库方面只需要使用limit即可实现分页.前后台交互就直接用session传了值. 下面就写写具体 ...

  8. FluentData Mysql分页的一个BUG

    开发环境 FluentData3.0.VS.NET2010.Mysql5.0 问题描述 使用FluentData对一个表(记录数28)进行分页时,突然发现一个诡异的问题,第一页返回10条数据正常,第二 ...

  9. php+mysql分页类的入门实例

    php+mysql分页类的简单代码 时间:2016-02-25 06:16:26来源:网络 导读:php+mysql分页类的简单代码,二个php分页类代码,对商品进行分页展示,当前页面数,每个页面展示 ...

随机推荐

  1. 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引

    先说背景,由于本人工作需要创建很多小应用程序,而且在微服务的大环境下,服务越来越多,然后就导致日志四分五裂,到处都有,然后就有的elk,那么问题来了 不能每个小应用都配置一个 logstash 服务来 ...

  2. java代码之美(12)---CollectionUtils工具类

    java代码之美(12)---CollectionUtils工具类 这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUt ...

  3. [转]POJ1006: 中国剩余定理的完美演绎

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117973   Accepted: 37026 Des ...

  4. [ArcGIS API for JavaScript 4.8] Sample Code-Popups-1-popupTemplate的概念和popup中属性字段值的多种表现形式

    [官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/index.html] 一. ...

  5. K3数据字典备查

    select distinct f.FNumber as 系统代码, f.FName AS 系统名称,  d.FTableName AS 表名,d.FDescription AS 表说明,a.[nam ...

  6. iOS----------四舍五入(只舍不入)

    NSString * totalAssetString =@"1161000.00"; NSDecimalNumber *totalAssetNumber = [NSDecimal ...

  7. string转QBytearray

    最近在程序中遇到要把图片的二进制string存成图片到本地,其实就是写文件 structCameraInfo tmpCameraInfo; string strData = tmpCalibrateR ...

  8. Python爬虫 【requests】request for humans

    安装 pip install requests 源码 git clone git://github.com/kennethreitz/requests.git 导入 import requests 发 ...

  9. Storm入门(十)Twitter Storm: Transactional Topolgoy简介

    作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/736/twitter-stor ...

  10. new Date()传参的浏览器兼容性

    测试以下是在IE9的测试情况 可以看到IE9不支持new Date('2018-1-2')和new Date('123456'),但是支持new Date('2018-01-02').new Date ...