使用IQueryable扩展方法实现复杂查询条件
问题
在业务开发中,经常要处理比较复杂的查询条件,如下图:
如果任一输入有值,则必须作为查询条件之一。
示例代码如下:
IQueryable<User> query = repository.GetAll();if(name!=null)
{query =query.Where(p=>p.Name==name);
}if(date!=null)
{query =query.Where(p=>p.Date==date);
}
或者把所有条件放到同一个Where子句中:
IQueryable<User> query = repository.GetAll().Where(p=>(name==null || p.Name==name) && (date==null || p.Date==date));
这两种写法都不好看,而且当条件更多时也不太容易维护。
解决方式
其实,从上面的示例代码可以看到,多个Where子句在同一个IQueryable中是可以多次使用的,最后的查询条件是所有Where子句的交集。
因此,我们可以定义一个扩展方法,根据前提条件是否满足,再决定是否增加Where子句,代码如下:
public static class IQueryableExtensions
{public static IQueryable<T> Where<T>(this IQueryable<T> query,bool condition,Expression<Func<T, bool>> predicate){return condition? query.Where(predicate): query;}
}
使用方法如下:
IQueryable<User> query = repository.GetAll().Where(name!=null, p=>p.Name==name).Where(date!=null, p=>p.Date==date);
这样就简洁明了多了!
结论
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!
使用IQueryable扩展方法实现复杂查询条件相关推荐
- 【.NET】IQueryable扩展方法实现复杂查询条件
业务开发中,经常处理比较复杂的查询条件 如果任一输入有值,则必须作为查询条件之一. 示例代码 IQueryable<User> query = repository.GetAll();if ...
- C#笔记13 匿名类型、集合初始化器、扩展方法和查询表达式
文章目录 匿名类型 new{...}和隐式类型var 集合初始化器和对象初始化器 扩展方法 案例引出扩展方法的意义 扩展方法的使用 做Enumerable的扩展方法 扩展方法使用 标准查询运算符 Li ...
- MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedListT结果集
namespace Entity { public interface IPagedList { /// <summary> /// 记录数 ...
- 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null
如题,"扩展方法where方法查询不到数据,不会抛异常,也不是返回的null",示例代码如下: Product类: public class Product{private str ...
- Ibatis查询条件对于特殊字符的处理方法
Ibatis的查询语句,在where中如果查询条件为%或_等特殊字符时,会把该表所有记录都显示出来,所以这些字符需要特殊处理一下: 比如在查询条件中,输入的查询条件中如果带有%,当时是在工具类包中定义 ...
- 关于MybatisPlus的QueryWrapper定义查询条件的and()和or()方法连用问题
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.它提供了QueryWrapper自定义查询对象,可以无 ...
- Mysql 拼接多个字段作为查询条件查询方法
最近工作中需要把多个字段拼接作为查询条件查询,特此记录便于日后查阅. <select id="listByProgramCodeList" resultType=" ...
- Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法
默认看到查询条件有 3 条结果,我想只查询出日期最晚的那一条记录. -- 默认查询条件 select settledate as "日期", syscalculationmny a ...
- 数据库中包含开始时间、结束时间,并且查询条件也有开始时间、结束时间的查询方法...
分类: oracle学习 数据库 例:考试表中有两个字段:startDate.endDate,分别代表考试开始时间.结束时间.现在需要查询某一时间段内正在进行的考试,实际只要满足考试的时间段和查询条件 ...
最新文章
- linux 类似winscp_mac如何连接远程linux,类似windows上的putty和winscp
- async spring 默认线程池_Spring boot注解@Async线程池实例详解
- (仿头条APP项目)3.二级页面首页的ViewPager页面切换
- Electron怎样进行渲染进程调试和使用浏览器和VSCode进行调试
- axis2 java.net.url_axis,axis2调用.net的webservice
- 致谢!LF AI Day
- 谁能救得了中兴?下一个是华为吗?
- Gvim开发环境配置笔记--Windows篇
- vsftpd不支持目录软链接的解决办法
- php支付接口要改动的参数,php支付接口_php支付宝支付接口程序及参数详解
- 标书制作详细教程(零基础速成,助力公司中标)
- P2339 [USACO04OPEN]Turning in Homework G 笔记/题解
- 关于java的文件操作
- skynet master/slave 模式
- A Swift Tour, 苹果新推出的开发语言
- MinIO客户端(mc命令)实现数据迁移
- http请求头中Referer的含义和作用
- 2019年北京理工大学计算机专硕上岸经验分享
- OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()
- 计算2的100000次方
热门文章
- mysql int 11 java_mysql中int(11)列的大小(以字节为单位)是多少?
- es6拼接字符串的方式。
- android获取手机机型、厂商、deviceID基本信息
- 纳税服务系统【角色与用户】
- 6 四大组件之Service
- wii拆机_设置防砖保护以保护和增强Wii
- vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(十一)构思商品页面...
- systemd kernel
- 能源项目xml文件 -- app-context.xml
- WPF中设置了WindowStyle=None后,窗口仍然有边框的解决方法