C#中Lambda表达式动态拼接生成工具类
本文代码转自这篇文章,先做下记录。
public static class LambdaUtil<T>{/// <summary>/// lambda表达式:t=>true/// </summary>/// <returns></returns>public static Expression<Func<T, bool>> True(){return t => true;}/// <summary>/// lambda表达式:t=>false/// </summary>/// <returns></returns>public static Expression<Func<T, bool>> False(){return t => false;}/// <summary>/// lambda表达式:t=>t.propName/// 多用于order排序/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <typeparam name="TKey">返回类型</typeparam>/// <param name="propName">属性名</param>/// <returns></returns>private static Expression<Func<T, TKey>> Order<TKey>(string propName){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个属性MemberExpression property = Expression.Property(parameter, propName);// 生成lambda表达式return Expression.Lambda<Func<T, TKey>>(property, parameter);}/// <summary>/// lambda表达式:t=>t.propName==propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> Equal(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个相等比较ExpressionBinaryExpression binary = Expression.Equal(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>t.propName!=propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> NotEqual(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个不相等比较ExpressionBinaryExpression binary = Expression.NotEqual(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>t.propName<propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> LessThan(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个不相等比较ExpressionBinaryExpression binary = Expression.LessThan(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>t.propName<=propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个不相等比较ExpressionBinaryExpression binary = Expression.LessThanOrEqual(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>t.propName>propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个不相等比较ExpressionBinaryExpression binary = Expression.GreaterThan(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>t.propName>=propValue/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue);// 创建一个不相等比较ExpressionBinaryExpression binary = Expression.GreaterThanOrEqual(member, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, parameter);}/// <summary>/// lambda表达式:t=>{t.contains(propvalue1) ||...||t.contains(propvalueN)}/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValues">属性值数组</param>/// <returns></returns>public static Expression<Func<T, bool>> In(string propName, string[] propValues){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t"); // left// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数Expression constant = Expression.Constant(false);// 创建一个方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });foreach (string item in propValues){// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right// 连接参数方法constant = Expression.Or(methodCall, constant);}// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(constant, new ParameterExpression[] { parameter });}/// <summary>/// lambda表达式:t=>{!(t.contains(propvalue1) ||...||t.contains(propvalueN))}/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValues">属性值数组</param>/// <returns></returns>public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数Expression constant = Expression.Constant(false);// 创建一个方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });foreach (string item in propValues){// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right// 连接参数方法constant = Expression.Or(methodCall, constant);}// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(Expression.Not(constant), new ParameterExpression[] { parameter });}/// <summary>/// lambda表达式:t=>t.propName.Contains(propValue)/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> Contains(string propName, string propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 创建一个方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(methodCall, parameter);}/// <summary>/// lambda表达式:t=>t.propName.Contains(propValue)/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> StartWith(string propName, string propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 创建一个方法MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(methodCall, parameter);}/// <summary>/// lambda表达式:t=>t.propName.Contains(propValue)/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> EndsWith(string propName, string propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 创建一个方法MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(methodCall, parameter);}/// <summary>/// lambda表达式:!(t=>t.propName.Contains(propValue))/// 多用于where条件/// </summary>/// <typeparam name="T">参数类型</typeparam>/// <param name="propName">属性名称</param>/// <param name="propValue">属性值</param>/// <returns></returns>public static Expression<Func<T, bool>> NotContains(string propName, string propValue){// 创建节点参数tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 创建一个成员(字段/属性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 创建一个常数ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 创建一个方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });// 创建一个带参数方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, constant);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(Expression.Not(methodCall), parameter);}/// <summary>/// lambda表达式:t=>{left and right}/// 多用于where条件/// </summary>/// <param name="left">左侧条件</param>/// <param name="right">右侧条件</param>/// <returns></returns>public static Expression<Func<T, bool>> And(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right){// 创建参数表达式InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());// 创建and运算BinaryExpression binary = Expression.And(left.Body, invocation);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);}/// <summary>/// lambda表达式:t=>{left or right}/// 多用于where条件/// </summary>/// <param name="left">左侧条件</param>/// <param name="right">右侧条件</param>/// <returns></returns>public static Expression<Func<T, bool>> Or(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right){// 创建参数表达式InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());// 创建or运算BinaryExpression binary = Expression.Or(left.Body, invocation);// 生成lambda表达式return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);}}
C#中Lambda表达式动态拼接生成工具类相关推荐
- Java中Lambda表达式和stream的使用
Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...
- Java中Lambda表达式的使用
目录 1 简介 2 Lambda表达式的组成 2.1 Lambda表达式的函数式接口 2.2 对接口的要求 3 Lambda使用 3.1 基本使用 3.2 使用Lambdas和Streams 4 ...
- Java8中Lambda表达式的10个例子
Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 //Before Java 8: new Thread(new Runnable() ...
- python lambda表达式_Python中lambda表达式
Python中lambda表达式 1.lambda的应⽤用场景 如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化. 2. lambda语法 lambda 参数列列表 : 表达式 ...
- Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...
- lambda表达式python啥意思_Python中lambda表达式是什么
Python中lambda表达式是什么 发布时间:2020-09-24 09:56:07 来源:亿速云 阅读:83 作者:Leah 本篇文章给大家分享的是有关Python中lambda表达式是什么,小 ...
- php有lambda表达式吗,Python中lambda表达式的简单介绍(附示例)
本篇文章给大家带来的内容是关于Python中lambda表达式的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:匿名函数的定义 lambda parameter ...
- 变量不合法的表达式JAVA_Java8中lambda表达式的语法,别人都会的,你还不会吗?「一」...
函数式编程 函数式编程是一种编程方式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是λ演算(lambda calculus),λ演算的函数可以接受函数当作输入(参数)和输出(返回值). 函数式 ...
- lambda函数if_Python3中lambda表达式与函数式编程讲解
今天小编就为大家分享一篇关于Python3中lambda表达式与函数式编程讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 简单来说,编程中提到的 lam ...
最新文章
- utf-8编码的中文注释 在 sourceinsight 显示乱码的解决方法---utf8 转gb2312插件
- java面试题3(java基础)
- Hadoop 2.x 完全分布式HA集群环境搭建
- 怎么计算网站高峰期并发量和所需的带宽?
- 剑指offer 替换空格
- 【足迹C++primer】52、,转换和继承虚函数
- Python二级笔记(3)
- C++中的引用与指针的区别
- 一篇文章带你读懂 MySQL 和 InnoDB
- Vue3学习笔记01:使用NPM方法安装Vue3
- webpack——一站到底一
- 关于分卷压缩文件打不开的问题
- 数学建模题目和模型汇总(2000-2019 国赛本科组)
- SURF算法python实现
- mysql规格单位转化_存储单位的换算(KB, MB, GB)
- excel求方差和标准差的函数_excel标准差函数是什么?怎么计算?
- 抽象类的作用是什么?
- 【爬虫】每天定时爬取网页小故事并发送至指定邮箱
- 2019年,微信多开软件排行榜
- 11. 盛最多水的容器(java实现)--2种解法(左右夹逼,暴力)LeetCode
热门文章
- SQLServer中的死锁的介绍
- (Kali)BackTrack-linux安全***测试系统盘
- Java_BigInteger
- nagios整合cacti2011版(五)
- Mybatis中resultMap
- 动态改变_Excel中如何动态改变可编辑区域?
- python遥感数据有偿处理_利用python读写tiff遥感影像数据
- 会计行业被计算机取代马云,会计人:为什么我神烦“人工智能取代说”?
- php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?
- r语言简介_R语言简介