分享一个 EF6 分页查询数据的 IQueryable 扩展方法

image

前言

不废话,直接上方法。_

IQueryable 扩展方法

  1. 方法一

    /// <summary>
    /// 由其它 Reponsitory 提供数据源,分页查询数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="S"></typeparam>
    /// <param name="source"></param>
    /// <param name="pageIndex"></param>
    /// <param name="pageSize"></param>
    /// <param name="whereLambda"></param>
    /// <param name="orderbyLambda"></param>
    /// <param name="total"></param>
    /// <param name="isAsc"></param>
    /// <returns></returns>
    public static List<T> FindPageList<T, S>(this IQueryable<T> source, int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, out int total, bool isAsc)
    {
    	total = source.Where(whereLambda).Count();
    
    	List<T> result;
    	if (isAsc)
    	{
    		result = source
    		  .Where(whereLambda)
    		  .OrderBy(orderbyLambda)
    		  .Skip(pageSize * (pageIndex - 1))
    		  .Take(pageSize)
    		  .ToList();
    	}
    	else
    	{
    		result = source
    		 .Where(whereLambda)
    		 .OrderByDescending(orderbyLambda)
    		 .Skip(pageSize * (pageIndex - 1))
    		 .Take(pageSize)
    		 .ToList();
    	}
    	return result;
    }
    
  2. 方法一

    /// <summary>
    /// 使用动态拼接 OrderBy 语句,分页查询数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="pageIndex"></param>
    /// <param name="pageSize"></param>
    /// <param name="whereLambda"></param>
    /// <param name="orderbyExpression"></param>
    /// <param name="total"></param>
    /// <returns></returns>
    public static List<T> FindPageList<T>(this IQueryable<T> source, int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, string orderbyExpression, out int total)
    {
    	total = source.Where(whereLambda).Count();
    
    	var result = source
    		.Where(whereLambda)
    		.OrderBy(orderbyExpression)
    		.Skip(pageSize * (pageIndex - 1))
    		.Take(pageSize)
    		.ToList();
    
    	return result;
    }
    
  3. 方法说明

    • 方法一使用 EF 传统的排序方法,所以不得不根据升序或降序的需求分开来写,代码有点复杂和重复

    • 方法二利用前文所介绍的 System.Linq.Dynamic 技术,代码更加简洁可读,但性能比方法一稍微差些

    • 这两个扩展方法的思路是利用 IQueryable 的不会立即执行的特点,将具体业务数据查询跟分页展示数据解耦,提高代码的复用性和可维护性。

使用例子

  1. 方法一的使用例子

    public List<T> QueryPageList<S>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, out int total, bool isAsc)
    {
    	var source = _dbContext.Set<T>().AsNoTracking().AsQueryable();
    	var result = source.FindPageList(pageIndex, pageSize, whereLambda, orderbyLambda, out total, isAsc);
    	return result; 
    }
    
    public List<TB01Dto> QueryPageList(QueryPageParams queryPageParams, out int total)
    {
    	Expression<Func<TB01, bool>> whereLambda = a => !a.STSHT01.Equals("D", StringComparison.OrdinalIgnoreCase);
    	if (!string.IsNullOrEmpty(queryPageParams.SearchKeyword))
    	{
    		Expression<Func<TB01, bool>> second = (a => a.NAMEHT01.Contains(queryPageParams.SearchKeyword) || a.COMPHT01 == queryPageParams.SearchKeyword);
    		whereLambda = whereLambda.And(second);
    	}
    	var list = QueryPageList(queryPageParams.PageIndex, queryPageParams.PageSize, whereLambda, (a => a.COMPHT01), out total, queryPageParams.IsAsc);
    	var result = CommonUtil.TranObject2OtherType<List<TB01Dto>>(list);
    	return result;
    }
    
  2. 方法二的使用例子

    public List<UserMenuDTO> QueryPageList(QueryPageParamsForuserMenu queryPageParams, out int total)
    {
    	 var query = userMenuReposition.QueryMenuUsers(queryPageParams.MenuUserName);
    	 
    	 Expression<Func<UserMenuDTO, bool>> whereLambda = a => true;
    	 
    	 if (queryPageParams.CompanyCodes != null && queryPageParams.CompanyCodes.Length > 0)
    	 {
    		Expression<Func<UserMenuDTO, bool>> second = (a => queryPageParams.CompanyCodes.Contains(a.COMPHT03));
    		whereLambda = whereLambda.And(second); 
    	 }
    	 
    	 var list = query.FindPageList(queryPageParams.PageIndex, queryPageParams.PageSize, whereLambda, "COMPHT03, MNUCDHT03", out total);
    	 
    	 return list;
    }
    

总结

分页查询数据是在处理大量数据时常用的一种技术,对于提高系统性能,优化用户体验,节约资源,并保证系统的稳定性和安全性等方面,非常有用。本文利用 IQueryable 不会立即执行的特点,扩展了 IQueryable 的方法,将具体业务数据查询跟分页展示数据解耦,有一定的适用性,可以将代码直接拷贝到项目中使用。

往期精彩

  1. 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你
  2. EF Core 性能很差?试试这 6 个小技巧
  3. 如何在 EF Core 中使用乐观并发控制
  4. EF Core 在实际开发中,如何分层?

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/796483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画;盘点用stable diffusion 赚钱的10种方式!

前言 stable diffusion 是一种基于文本生成图像的深度学习模型&#xff0c;它可以根据任何文本输入生成逼真的图像。它利用了 CLIP ViT-L/14 文本编码器的文本嵌入和扩散模型的潜在变量&#xff0c;实现了高质量的图像合成。 stable diffusion 可以用于赚钱的10种方式及思路如…

【Django+Vue3项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip&#xff1a; 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术&#xff0c;广泛应用于…

买不到用户的大模型,开始倒闭了

前段时间各个大模型开始降价甚至免费&#xff0c;都是为了抢夺用户&#xff1b;而随着AI加持&#xff0c;iPhone也要来抢夺用户&#xff1b;这种情况下&#xff0c;没有用户甚至买不到用户的大模型&#xff0c;已经开始倒闭了。 拿到2000万元创业投资的大林&#xff0c;仅过了一…

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序

LeetCode刷题笔记第3011题&#xff1a;判断一个数组是否可以变为有序 题目&#xff1a; 想法&#xff1a; 使用冒泡排序进行排序&#xff0c;在判断大小条件时加入判断二进制下数位为1的数目是否相同&#xff0c;相同则可以进行互换。最后遍历数组&#xff0c;相邻两两之间是…

创建地形——笔记

1、创建地面 (1) 3D Object-Terrain (2) 导入资源 (3) 选中Terrain&#xff0c;绘制贴图 (4) 新建一个沙土层 (5) 编辑沙土层——选中Inspector中的新建沙土层&#xff0c;出现编辑面板 依次点击Nomal Map和Mask Map右侧的Slect&#xff0c;增加法线贴图&#xff08;紫&…

【Redis】初识 Redis

文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

keepalive和haproxy

1、keepalive 1.1概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;主停止工作&#xff0c;vip漂移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器 1、配优先级 …

智能优化算法之蚁群算法ACO

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;由意大利学者马尔科多里戈&#xff08;Marco Dorigo&#xff09;于1992年在其博士论文中首次提出。灵感来自于自然界中的蚂蚁群体行为&#xff0c;特别是蚂蚁在寻找食物过程中所展示的路径优化能力。蚁群算法属于…

基于stm32+小程序开发智能家居门禁系统-硬件-软件实现

视频演示&#xff1a; 基于stm32智能家居门禁系统小程序开发项目 视频还有添加删除卡号&#xff0c;添加删除指纹&#xff0c;关闭继电器电源等没有演示。 代码Git&#xff1a; https://github.com/Abear6666/stm32lock 总体功能&#xff1a; 本门禁系统主要解锁功能分别为卡…

一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

离线 VisualStudio2022 安装包在无互联网的环境下安装

文章目录 下载 Visual Studio 引导程序以创建布局离线安装包将离线包更新为产品的最新版本将布局更新为产品的特定版本 下载 Visual Studio 引导程序以创建布局 https://learn.microsoft.com/zh-cn/visualstudio/install/create-a-network-installation-of-visual-studio?vie…

Golang | Leetcode Golang题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; func computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 int) int {area1 : (ax2 - ax1) * (ay2 - ay1)area2 : (bx2 - bx1) * (by2 - by1)overlapWidth : min(ax2, bx2) - max(ax1, bx1)overlapHeight : min(ay2, by2) - max(ay1, by1)…

浅谈后置处理器之JSON提取器

浅谈后置处理器之JSON提取器 JMeter 的 JSON 提取器&#xff08;JSON Extractor&#xff09;是一个强大的后置处理器&#xff0c;它允许用户从HTTP响应、数据库查询或其他类型的响应中提取JSON数据&#xff0c;并将这些数据存储为变量&#xff0c;以便在后续的请求中重用。这对…

从数据仓库到数据湖(上):数据湖导论

文章目录 一、什么是数据湖&#xff1f;起源数据湖的特征 二、为什么要用数据湖&#xff1f;三、数据湖与数据仓库的区别数据仓库和数据湖的对比 四、数据湖本质数据存储架构数据处理工具&#xff1a;三类第一类工具第二类工具第三类工具 小结 五、总结六、参考资料 一、什么是…

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

手机怎么用代理ip上网

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。然而&#xff0c;有时候出于安全、隐私或访问特定网络资源的需要&#xff0c;我们可能需要使用代理IP来上网。那么&#xff0c;什么是代理IP&#xff1f;如何在手机上设置并使用它呢&#xff1f;本文将为您详…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作&#xff0c;它可以帮助企业展示产品、服务和品牌形象&#xff0c;吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段&#xff0c;需要和客…