动态拼接Lambda表达式

添加类

    #region lambda expression 拼接方式1/// <summary>/// Expression表达式树/// </summary>public class LambdaParameteRebinder : ExpressionVisitor{/// <summary>/// 存放表达式树的参数的字典/// </summary>private readonly Dictionary<ParameterExpression, ParameterExpression> map;/// <summary>/// 构造函数/// </summary>/// <param name="map"></param>public LambdaParameteRebinder(Dictionary<ParameterExpression, ParameterExpression> map){this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();}/// <summary>/// 重载参数访问的方法,访问表达式树参数,如果字典中包含,则取出/// </summary>/// <param name="node">表达式树参数</param>/// <returns></returns>protected override Expression VisitParameter(ParameterExpression node){if (map.TryGetValue(node, out ParameterExpression expression)){node = expression;}return base.VisitParameter(node);}public static Expression ReplaceParameter(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp){return new LambdaParameteRebinder(map).Visit(exp);}}/// <summary>/// 表达式数的lambda参数的拼接扩展方法/// </summary>public static class LambdaExtension{/// <summary>/// Expression表达式树lambda参数拼接组合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <param name="merge"></param>/// <returns></returns>public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge){var parameterMap = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);var secondBody = LambdaParameteRebinder.ReplaceParameter(parameterMap, second.Body);return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);}/// <summary>/// Expression表达式树lambda参数拼接--false/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static Expression<Func<T, bool>> False<T>() => f => false;/// <summary>/// Expression表达式树lambda参数拼接-true/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static Expression<Func<T, bool>> True<T>() => f => true;/// <summary>/// Expression表达式树lambda参数拼接--and/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) => first.Compose(second, Expression.And);/// <summary>/// Expression表达式树lambda参数拼接--or/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) => first.Compose(second, Expression.Or);}#endregion#region lambda expression 拼接方式2/// <summary>/// 表达式数的lambda参数的拼接扩展方法扩展类/// </summary>public class LambdaExpressionParameter : ExpressionVisitor{/// <summary>/// 表达式数的lambda参数/// </summary>public ParameterExpression parameterExpression { get; private set; }/// <summary>/// 构造函数/// </summary>/// <param name="parameterExpression"></param>public LambdaExpressionParameter(ParameterExpression parameterExpression){this.parameterExpression = parameterExpression;}/// <summary>/// 替代方法/// </summary>/// <param name="expression"></param>/// <returns></returns>public Expression Replace(Expression expression){return base.Visit(expression);}/// <summary>/// 重载参数访问的方法,处理参数表达式/// </summary>/// <param name="node"></param>/// <returns></returns>protected override Expression VisitParameter(ParameterExpression node){return this.parameterExpression;}}/// <summary>/// 表达式数的lambda参数的拼接扩展方法/// </summary>public static class LambdaExpressionExtend{/// <summary>/// Expression表达式树lambda参数拼接--and/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> And1<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){//var param = first.Parameters[0];var param = Expression.Parameter(typeof(T), "w");//指定参数和参数名称LambdaExpressionParameter lambdaExpression = new LambdaExpressionParameter(param);var left = lambdaExpression.Replace(first.Body);var right = lambdaExpression.Replace(second.Body);var body = Expression.And(left, right);return Expression.Lambda<Func<T, bool>>(body, param);}/// <summary>/// Expression表达式树lambda参数拼接--or/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></param>/// <returns></returns>public static Expression<Func<T, bool>> Or1<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){//var param = first.Parameters[0];var param = Expression.Parameter(typeof(T), "w");//指定参数和参数名称LambdaExpressionParameter lambdaExpression = new LambdaExpressionParameter(param);var left = lambdaExpression.Replace(first.Body);var right = lambdaExpression.Replace(second.Body);var body = Expression.Or(left, right);return Expression.Lambda<Func<T, bool>>(body, param);}/// <summary>/// Expression表达式树lambda参数拼接--not/// </summary>/// <typeparam name="T"></typeparam>/// <param name="expression"></param>/// <returns></returns>public static Expression<Func<T, bool>> Not1<T>(this Expression<Func<T, bool>> expression){var param = expression.Parameters[0];//指定参数和参数名称//var param = Expression.Parameter(typeof(T), "w");var body = Expression.Not(expression.Body);return Expression.Lambda<Func<T, bool>>(body, param);}}#endregion

测试运行

namespace Test
{public class Program{static void Main(string[] args){List<int> grades1 = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };Expression<Func<int, bool>> expression = t => true;expression = expression.And1(t => t > 2);expression = expression.And1(t => t < 8);var ds = grades1.AsQueryable().Where(expression).ToList();foreach (var item in ds){Console.WriteLine($"IQueryable:{item}");}Console.Read();}}
}

动态拼接Lambda表达式2相关推荐

  1. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  2. C#动态创建lambda表达式

    /// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <typeparam name="T&q ...

  3. c# 拼接lambda表达式 (转载)

    项目中用到,找不到出处了 1. 添加类: public static class PredicateExtensions{public static Expression<Func<T, ...

  4. SqlDataReader生成动态Lambda表达式

    上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...

  5. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  6. 反射、Lambda表达式(Java学习笔记十二)

    文章目录 反射 Class 类 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 调用指定方法 调用指定属性 关于setAccessible方法的使用: 动态代理 Lambda表达式 ...

  7. C#中Lambda表达式动态拼接生成工具类

    本文代码转自这篇文章,先做下记录. public static class LambdaUtil<T>{/// <summary>/// lambda表达式:t=>tru ...

  8. Java JVM 动态方法调用指令 invokedynamic 实现分析(以 Lambda 表达式实现原理为例)...

    一.前言 对于 invokedynamic 指令的实现需要方法句柄作为前提知识点.可参考 Java JVM 动态方法调用之方法句柄 MethodHandle. 本文以 Lambda 表达式中运用 in ...

  9. Java 8 动态类型语言Lambda表达式实现原理分析

    Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标. import java.util.function.Co ...

  10. Linq、Lambda表达式详细总结(转)

    (一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的 左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数 ...

最新文章

  1. python数据写入CSV
  2. CString初始化时提示字符串太大
  3. const修饰是指针和常量
  4. 密码与安全新技术总结
  5. SpringBoot—@ComponentScan注解过滤排除某个类
  6. 爆料称华为P50系列即将进入量产 或将于下月发布
  7. asp.net 调用(引用 Native dll 的)C++/CLI dll 的问题及解决
  8. 开课吧:深入了解C++和C语言的血缘关系
  9. Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
  10. 根据两点经纬度计算距离和角度——java实现
  11. icon图标制作与使用
  12. pip使用详解/pip换源
  13. Forest上传下载功能使用
  14. FBX导入Unity中模型没有材质的处理
  15. 2022年终总结(学习篇)
  16. JAVA RSA算法加密实现 eclipse
  17. 使用 Cocos Creator 引擎创建3D资产
  18. JS禁止使用Enter键
  19. 旅游网站大数据分析 - 数据清洗
  20. 视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化

热门文章

  1. 应用计算机测线性电阻伏安特性曲线,测绘线性电阻和非线性电阻的伏安特性曲线.pdf...
  2. 【量化课堂】风险模型
  3. java 人脸活体检测_人脸识别活体检测测试案例
  4. Linux设置小红点键盘,让Ubuntu完美支持Thinkpad小红点Trackpoint
  5. 黑马程序员 接口 总结
  6. dell笔记本耳机怎么设置_戴尔笔记本电脑怎样设置耳机
  7. 如何更改Windows桌面文件夹路径
  8. python爬楼梯多少种_LeetCode70爬楼梯-Python3-两种方法实现
  9. C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码
  10. 微信小程序 SEO 指南