动态拼接Lambda表达式2
动态拼接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相关推荐
- 动态创建Lambda表达式实现高级查询
需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...
- C#动态创建lambda表达式
/// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <typeparam name="T&q ...
- c# 拼接lambda表达式 (转载)
项目中用到,找不到出处了 1. 添加类: public static class PredicateExtensions{public static Expression<Func<T, ...
- SqlDataReader生成动态Lambda表达式
上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对Sq ...
- Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...
- 反射、Lambda表达式(Java学习笔记十二)
文章目录 反射 Class 类 创建运行时类的对象 获取运行时类的完整结构 调用运行时类的指定结构 调用指定方法 调用指定属性 关于setAccessible方法的使用: 动态代理 Lambda表达式 ...
- C#中Lambda表达式动态拼接生成工具类
本文代码转自这篇文章,先做下记录. public static class LambdaUtil<T>{/// <summary>/// lambda表达式:t=>tru ...
- Java JVM 动态方法调用指令 invokedynamic 实现分析(以 Lambda 表达式实现原理为例)...
一.前言 对于 invokedynamic 指令的实现需要方法句柄作为前提知识点.可参考 Java JVM 动态方法调用之方法句柄 MethodHandle. 本文以 Lambda 表达式中运用 in ...
- Java 8 动态类型语言Lambda表达式实现原理分析
Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标. import java.util.function.Co ...
- Linq、Lambda表达式详细总结(转)
(一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的 左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数 ...
最新文章
- python数据写入CSV
- CString初始化时提示字符串太大
- const修饰是指针和常量
- 密码与安全新技术总结
- SpringBoot—@ComponentScan注解过滤排除某个类
- 爆料称华为P50系列即将进入量产 或将于下月发布
- asp.net 调用(引用 Native dll 的)C++/CLI dll 的问题及解决
- 开课吧:深入了解C++和C语言的血缘关系
- Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
- 根据两点经纬度计算距离和角度——java实现
- icon图标制作与使用
- pip使用详解/pip换源
- Forest上传下载功能使用
- FBX导入Unity中模型没有材质的处理
- 2022年终总结(学习篇)
- JAVA RSA算法加密实现 eclipse
- 使用 Cocos Creator 引擎创建3D资产
- JS禁止使用Enter键
- 旅游网站大数据分析 - 数据清洗
- 视频直播源码 直播软件搭建进行直播推流时,对声音进行音质优化
热门文章
- 应用计算机测线性电阻伏安特性曲线,测绘线性电阻和非线性电阻的伏安特性曲线.pdf...
- 【量化课堂】风险模型
- java 人脸活体检测_人脸识别活体检测测试案例
- Linux设置小红点键盘,让Ubuntu完美支持Thinkpad小红点Trackpoint
- 黑马程序员 接口 总结
- dell笔记本耳机怎么设置_戴尔笔记本电脑怎样设置耳机
- 如何更改Windows桌面文件夹路径
- python爬楼梯多少种_LeetCode70爬楼梯-Python3-两种方法实现
- C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码
- 微信小程序 SEO 指南