问题

在业务开发中,经常要处理比较复杂的查询条件,如下图:

如果任一输入有值,则必须作为查询条件之一。

示例代码如下:

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扩展方法实现复杂查询条件相关推荐

  1. 【.NET】IQueryable扩展方法实现复杂查询条件

    业务开发中,经常处理比较复杂的查询条件 如果任一输入有值,则必须作为查询条件之一. 示例代码 IQueryable<User> query = repository.GetAll();if ...

  2. C#笔记13 匿名类型、集合初始化器、扩展方法和查询表达式

    文章目录 匿名类型 new{...}和隐式类型var 集合初始化器和对象初始化器 扩展方法 案例引出扩展方法的意义 扩展方法的使用 做Enumerable的扩展方法 扩展方法使用 标准查询运算符 Li ...

  3. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedListT结果集

    namespace Entity {     public interface IPagedList     {         /// <summary>         /// 记录数 ...

  4. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null

    如题,"扩展方法where方法查询不到数据,不会抛异常,也不是返回的null",示例代码如下: Product类: public class Product{private str ...

  5. Ibatis查询条件对于特殊字符的处理方法

    Ibatis的查询语句,在where中如果查询条件为%或_等特殊字符时,会把该表所有记录都显示出来,所以这些字符需要特殊处理一下: 比如在查询条件中,输入的查询条件中如果带有%,当时是在工具类包中定义 ...

  6. 关于MybatisPlus的QueryWrapper定义查询条件的and()和or()方法连用问题

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生.它提供了QueryWrapper自定义查询对象,可以无 ...

  7. Mysql 拼接多个字段作为查询条件查询方法

    最近工作中需要把多个字段拼接作为查询条件查询,特此记录便于日后查阅. <select id="listByProgramCodeList" resultType=" ...

  8. Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法

    默认看到查询条件有 3 条结果,我想只查询出日期最晚的那一条记录. -- 默认查询条件 select settledate as "日期", syscalculationmny a ...

  9. 数据库中包含开始时间、结束时间,并且查询条件也有开始时间、结束时间的查询方法...

    分类: oracle学习 数据库 例:考试表中有两个字段:startDate.endDate,分别代表考试开始时间.结束时间.现在需要查询某一时间段内正在进行的考试,实际只要满足考试的时间段和查询条件 ...

最新文章

  1. linux 类似winscp_mac如何连接远程linux,类似windows上的putty和winscp
  2. async spring 默认线程池_Spring boot注解@Async线程池实例详解
  3. (仿头条APP项目)3.二级页面首页的ViewPager页面切换
  4. Electron怎样进行渲染进程调试和使用浏览器和VSCode进行调试
  5. axis2 java.net.url_axis,axis2调用.net的webservice
  6. 致谢!LF AI Day
  7. 谁能救得了中兴?下一个是华为吗?
  8. Gvim开发环境配置笔记--Windows篇
  9. vsftpd不支持目录软链接的解决办法
  10. php支付接口要改动的参数,php支付接口_php支付宝支付接口程序及参数详解
  11. 标书制作详细教程(零基础速成,助力公司中标)
  12. P2339 [USACO04OPEN]Turning in Homework G 笔记/题解
  13. 关于java的文件操作
  14. skynet master/slave 模式
  15. A Swift Tour, 苹果新推出的开发语言
  16. MinIO客户端(mc命令)实现数据迁移
  17. http请求头中Referer的含义和作用
  18. 2019年北京理工大学计算机专硕上岸经验分享
  19. OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()
  20. 计算2的100000次方

热门文章

  1. mysql int 11 java_mysql中int(11)列的大小(以字节为单位)是多少?
  2. es6拼接字符串的方式。
  3. android获取手机机型、厂商、deviceID基本信息
  4. 纳税服务系统【角色与用户】
  5. 6 四大组件之Service
  6. wii拆机_设置防砖保护以保护和增强Wii
  7. vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(十一)构思商品页面...
  8. systemd      kernel
  9. 能源项目xml文件 -- app-context.xml
  10. WPF中设置了WindowStyle=None后,窗口仍然有边框的解决方法