按照通常的方式分页查询至少要查询数据两遍,一个操作是查询总数,另一个是查询数据,这样有些耗时

这里介绍一个基于EF的插件 EntityFramework.Extended,当然这个插件有很多的功能,比方说批量删除、批量修改、批量查询、缓存查询等

这里只介绍批量查询的方法

通过SQL Server Profilter监视生成的SQL代码,发现只连接了一次数据库,非常的厉害


不解释直接上代码

通用分页查询方法:

         /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="TKey">排序类型</typeparam>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页大小</param>
/// <param name="isAsc">是否升序排列</param>
/// <param name="predicate">条件表达式</param>
/// <param name="keySelector">排序表达式</param>
/// <returns></returns>
public virtual IPage<TEntity> Page<TKey>(int pageIndex, int pageSize, Expression<Func<TEntity, bool>> predicate, bool isAsc,
Expression<Func<TEntity, TKey>> keySelector)
{
if (pageIndex <= && pageSize <= )
{
throw new Exception("pageIndex或pageSize不能小于等于0!");
}
IPage<TEntity> page = new Page<TEntity>()
{
PageIndex = pageIndex,
PageSize = pageSize
};
int skip = (pageIndex - ) * pageSize;
if (predicate == null)
{
FutureCount fcount = this.dbSet.FutureCount();
FutureQuery<TEntity> futureQuery = isAsc
? this.dbSet.OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
: this.dbSet.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
page.TotalItems = fcount.Value;
page.Items = futureQuery.ToList();
page.TotalPages = page.TotalItems / pageSize;
if ((page.TotalItems % pageSize) != ) page.TotalPages++;
}
else
{
var queryable = this.dbSet.Where(predicate);
FutureCount fcount = queryable.FutureCount();
FutureQuery<TEntity> futureQuery = isAsc
? queryable.OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
: queryable.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
page.TotalItems = fcount.Value;
page.Items = futureQuery.ToList();
page.TotalPages = page.TotalItems / pageSize;
if ((page.TotalItems % pageSize) != ) page.TotalPages++;
}
return page;
}

分页实体:

     /// <summary>
/// 分页实体
/// </summary>
/// <typeparam name="T">实体</typeparam>
public class Page<T> : IPage<T>
{
/// <summary>
/// 当前页
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 查询集合总个数
/// </summary>
public int TotalItems { get; set; }
/// <summary>
/// 每页项数
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 查询集合
/// </summary>
public IList<T> Items { get; set; }
} /// <summary>
/// 分页实体接口
/// </summary>
/// <typeparam name="T">实体</typeparam>
public interface IPage<T>
{
/// <summary>
/// 当前页
/// </summary>
int PageIndex { get; set; }
/// <summary>
/// 总页数
/// </summary>
int TotalPages { get; set; }
/// <summary>
/// 查询集合总个数
/// </summary>
int TotalItems { get; set; }
/// <summary>
/// 每页项数
/// </summary>
int PageSize { get; set; }
/// <summary>
/// 查询集合
/// </summary>
IList<T> Items { get; set; }
}

EF 分页查询优化的更多相关文章

  1. EF分页中的陷阱

    (一) 前言                                                                   EF使用非常简单,但是如果使用不当就会误入EF陷阱中. ...

  2. 存储过程分页 Ado.Net分页 EF分页 满足90%以上

    存储过程分页: create proc PR_PagerDataByTop @pageIndex int, @pageSize int, @count int out as select top(@p ...

  3. (整理)EF分页的实现

    最近做一个小功能,需要数据分页,因为小框架使用的是EF,因此查询了一下EF的分页. EF分页主要用到了skip和take两个方法: GetListBy(lamda xxxxx).skip(PageSi ...

  4. Mongoose 分页查询优化、获取数据总长度

    无论是传统网页还是 ajax api,我们都不得不进行数据分页,一来节省带宽二来提升页面响应速度.作为一个数据完备的 web 应用,做好分页功能能极大提升用户体验. 简单的分页查询 在 mongoos ...

  5. .NET Core使用EF分页查询数据报错:OFFSET语法错误问题

    在Asp.Net Core MVC项目中使用EF分页查询数据时遇到一个比较麻烦的问题,系统会报如下错误: 分页查询代码: ) * condition.PageSize).Take(condition. ...

  6. MongoDB分页查询优化方法

    在网上看到很多关于MongoDB分页查询优化的文章,如出一辙.笔者自己实际生产中也遇到此问题,所以看了很多篇文章,这里分享一篇简明扼要的文章分享给大家,希望对大家在使用MongoDB时有所帮助. 凡事 ...

  7. EF分页问题探讨之 OrderBy

    EntityFramework 应用场景 最近被应用程序中页面加载慢的问题所折磨,看似容易的问题,其实并不容易(已经持续两天时间了),经过“侦查”,发现了两个“嫌疑犯”: EntityFramewor ...

  8. mysql通过“延迟关联”进行limit分页查询优化的一个实例

    最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化. 第一步,找到执行慢的sql,如下: SELECT  ...

  9. 利用JqGrid结合ashx及EF分页显示列表之二

    上一篇文章简单利用JqGrid及ashx进行一个数据列表的显示,要文的重点是利用EF的分页与JqGrid进行结合,EF本文只是简单运用所以没有很规范,重点还是JqGrid分页的实现;本实例把JqGri ...

随机推荐

  1. Sql Server系列:多表连接查询

    连接查询是关系数据中最主要的查询,包括内连接.外连接等.通过连接运算符可以实现多个表查询.内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.SQL Server中的内连接有 ...

  2. SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志

    1.IP地址配置不正确: 打开 Microsoft SQL Server 2005配置工具下的SQL Server Configuration Manager,选择MSSQLSERVER协议, 然后双 ...

  3. 【转】SQL修改字段长度

    语法: alter table <表名> alter column <字段名> 新类型名(长度) 示例:假如有名T1,字段名F1,原来F1为varchar(3),现在要改为va ...

  4. Android中Bitmap,byte[],Drawable相互转化

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  5. 为什么要学习Linux

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 本篇修改自我在知乎上回答的问题,为什么要学习 Linux? 我最开始用Linux是 ...

  6. android:theme决定AlertDialog的背景颜色

    最近遇到一个很奇怪的问题,两个项目弹出的dialog背景颜色不一样,一个是黑色的,一个是白色的,最后发现是AndroidManifest.xml文件里面application指定的android:th ...

  7. 遇到 HTTP 错误 403.14 - Forbidden?

    打开 http://localhost:1609 报错: HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容 解决方案一:设置默认首页 在 Web.conf ...

  8. 关于有默认值的字段在用EF做插入操作时的思考(续)

    问题描述 今天下午(看现在这时间,应该是昨天下午了哈),园友 choon 写了这样一篇博文<关于有默认值的字段在用EF做插入操作时的思考>. 博文内容主要记录的是 choon 使用 EF ...

  9. ZOJ Problem Set - 1109 Language of FatMouse

    这道题目最让人头疼的就是该题的input怎么结束,因为它要求输入一个空行的时候则一串字符串输入结束,这就不得不让人绕个弯来解决这个问题. (注:本人习惯于使用C中的字符串操作,但是用到map要求使用s ...

  10. MySQL入门03-MySQL配置安全性、易用性

    一.设定管理员用户和密码 二.处理test库权限隐患 三.自定义脚本提升易用性 中间定义文件 启动MySQL服务 关闭MySQL服务 快捷登录MySQL 四.设置开机自动启动MySQL服务 Refer ...