在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询)。
我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的目的的。但这样又会破坏程序的一至性,本来使用Entiry Framwork的目标就是用面向对象的方式操纵数据库,这样我们又要开始写SQL语句了。

其实我一开始也是这样做的直到有一天我们部门的美女程序员给我介绍LinqKit,我才开始用PredicateBuilder来拼接Predicate委托。

PredicateBuilder是LinqKit库的一部分,下面是PredicateBuilder源代码:

using System;
using System.Linq;
using System.Linq.Expressions;namespace LinqUtil
{public static class PredicateBuilder{public static Expression<Func<T, bool>> True<T>(){return f => true;}public static Expression<Func<T, bool>> False<T>(){return f => false;}public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2){var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);}public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2){var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);}}
}

这里主要是介绍PredicateBuilder的使用,如想了解PredicateBuilder具体是怎么实现的可以看看这篇文章:传送门

引入PredicateBuilder依赖

  • 用VS的NuGet安装LinqKit
  • 直接引用上面的源码

创建PredicateBuilder对象

var where = PredicateBuilder.True<TrendStatics>();

可以理解为创建一个初始化为True的Predicate。

注意:如果你是要创建一个OR组成的Predicate就不能把它初始化为True因为这样这个表达试永远为True了。

var where = PredicateBuilder.False<TrendStatics>();

可以理解为创建一个初始化为False的Predicate。

注意:如果你是要创建一个AND组成的Predicate就不能把它初始化为False因为这样这个表达试永远为False了。

PredicateBuilder对象拼接

现在你可以对Predicate进行各种拼接了

  • 全And:
  • var where = PredicateBuilder.True<int>();
    where = where.And(x => x >= 50);
    where = where.And(x => x <= 70);
    var res = list.Where(where.Compile());
  • 全Or:
  • var list  = Enumerable.Range(1, 100);
    var where = PredicateBuilder.False<int>();
    where = where.Or(x => x == 50);
    where = where.Or(x => x == 70);
    var res = list.Where(where.Compile());
  • 各种组合:
  • var list  = Enumerable.Range(1, 100);
    var where = PredicateBuilder.True<int>();
    where = where.And(x => x >= 50);
    where = where.And(x => x <= 70);
    var subwhere = PredicateBuilder.False<int>();
    subwhere = subwhere.Or(x => x == 60);
    subwhere = subwhere.Or(x => x == 61);
    where = where.And(subwhere);
    var res = list.Where(where.Compile());

PredicateBuilder对象使用

  • 针对集合Linq查询

你可以这样用:

var res = list.Where(where.Compile());

你还可以这样用:

var res = list.AsQueryable().Where(where);
  • 针对Entity Framework:
var res = table.Where(where.Expand());

转载请注明出处:http://www.cnblogs.com/keitsi/p/5621136.html

转载于:https://www.cnblogs.com/qq52117354/p/7773262.html

用PredicateBuilder实现Linq动态拼接查询相关推荐

  1. oracle数据库动态拼接查询条件解决方案

    在项目中遇到需要动态拼接查询条件的需求,现将解决方案列于下. 一. select * from table t where ('$(param)' is null or t.filed = '$(pa ...

  2. linq 动态拼接where条件 类似 T_SQL And Or

    废话不多说,直接上代码  复制可 1 internal class NewExpressionVisitor : ExpressionVisitor 2 { 3 public ParameterExp ...

  3. LINQ to SQL 运行时动态构建查询条件

    原文地址:http://msdn.microsoft.com/zh-cn/dd567295.aspx 在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句 ...

  4. 代码中(C#)支持动态拼接SQL的参数化查询

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...

  5. Mysql预编译动态拼接表名查询

    1.实现目标,现在对deal_runnning表进行按年月分表,需要动态拼接表名查询 2.需要执行此sql .表名要动态拼接,目标sql如下,使用concat连接表名无效. SELECT id, ba ...

  6. ExpressionFuncT, bool拼接查询条件

    由于项目中经常要用到类似db.students.where多条件查询,因此需要拼接查询条件. 网上搜索大部分出自 Dynamically Composing Expression Predicates ...

  7. jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能

    概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...

  8. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

  9. php如何拼接变量名,php动态拼接变量名,可变变量,动态变量,使用花括号,使用两个$符...

    php动态拼接变量名,可变变量,动态变量,使用花括号,使用两个$符 方式一:使用花括号,前缀部分不需要用单引号 $nums10 = 100; $xxx*${bcount.$nums10}['m54'] ...

最新文章

  1. PB 级数据处理挑战,Kubernetes如何助力基因分析?
  2. mysql group by using filesort优化
  3. Windows下给SourceTree配置外部比较工具BeyondCompare
  4. NB-IoT SNR RSRQ RSRP等信号参数解释
  5. java 最优算法_java 问题 求个最优算法
  6. 操作mysql_MySQL 事务操作
  7. 《算法设计》求单峰数组
  8. coturn源码解析
  9. SSH三大框架的工作原理及流程
  10. FPGA实现的线性反馈移位寄存器LFSR
  11. 百度开源呼叫中心系统
  12. 获取富文本中的图片链接
  13. Unity3D iPhone开发入门 (转)iPhoneSettings.
  14. 读书印记 - 《文案创作完全手册:文案大师教你一步步写出销售力》
  15. CSS复合选择器、元素显示模式、背景
  16. Microsoft Defender SmartScreen 阻止了无法识别的应用启动,Windows已阻止此软件和无法验证发布者两个问题的解决方法(以腾讯云服务器为例的三种保姆级图文解决方法)
  17. Jetson TX1 开发教程(1)--配置与刷机
  18. 1. 简介(The caret package )
  19. 中间件厂商及相关产品榜
  20. 【算法实现】随机森林算法的房屋价格预测模型

热门文章

  1. linux malloc free 内存碎片_内存申请malloc/new与内存释放free/delete的区别
  2. 简单报价单模板_圣诞节祝福邮件必这样写【附件参考模板BY埃马】
  3. Java类型转换工具类(十六进制—bytes互转、十进制—十六进制互转,String—Double互转)
  4. json串 转 list<class> 方法 List转JSONArray和JSONArray转List
  5. 运行MYSQL数据库命令时connetion Timeout expired异常问题
  6. csrf 攻击及防御
  7. 使用vue+elementUI+springboot创建基础后台增删改查的管理页面--(1)
  8. spring定时,cronExpression表达式解释
  9. Linux基础 -- vim编辑器3 -- 查找和替换
  10. java中写sql语句的小小细节