Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >c# Lambda扩展

c# Lambda扩展

作者头像
冰封一夏
发布于 2019-09-11 07:17:45
发布于 2019-09-11 07:17:45
63800
代码可运行
举报
运行总次数:0
代码可运行

扩展类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1  public static class LinqExtensions
  2     {
  3         /// <summary>
  4         /// 创建lambda表达式:p=>true
  5         /// </summary>
  6         /// <typeparam name="T">对象名称(类名)</typeparam>
  7         /// <returns></returns>
  8         public static Expression<Func<T, bool>> True<T>()
  9         {
 10             return p => true;
 11         }
 12 
 13         /// <summary>
 14         /// 创建lambda表达式:p=>false
 15         /// </summary>
 16         /// <typeparam name="T">对象名称(类名)</typeparam>
 17         /// <returns></returns>
 18         public static Expression<Func<T, bool>> False<T>()
 19         {
 20             return p => false;
 21         }
 22 
 23         /// <summary>
 24         /// 创建lambda表达式:p=>p.propertyName
 25         /// </summary>
 26         /// <typeparam name="T">对象名称(类名)</typeparam>
 27         /// <typeparam name="TKey">参数类型</typeparam>
 28         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
 29         /// <returns></returns>
 30         public static Expression<Func<T, TKey>> GetOrderExpression<T, TKey>(string propertyName)
 31         {
 32             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
 33             return Expression.Lambda<Func<T, TKey>>(Expression.Property(parameter, propertyName), parameter);
 34         }
 35 
 36         /// <summary>
 37         /// 创建lambda表达式:p=>p.propertyName == propertyValue
 38         /// </summary>
 39         /// <typeparam name="T">对象名称(类名)</typeparam>
 40         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
 41         /// <param name="propertyValue">数据值</param>
 42         /// <returns></returns>
 43         public static Expression<Func<T, bool>> CreateEqual<T>(string propertyName, object propertyValue, Type typeValue)
 44         {
 45             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
 46             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
 47             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
 48             return Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter);
 49         }
 50 
 51         /// <summary>
 52         /// 创建lambda表达式:p=>p.propertyName != propertyValue
 53         /// </summary>
 54         /// <typeparam name="T">对象名称(类名)</typeparam>
 55         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
 56         /// <param name="propertyValue">数据值</param>
 57         /// <returns></returns>
 58         public static Expression<Func<T, bool>> CreateNotEqual<T>(string propertyName, object propertyValue, Type typeValue)
 59         {
 60             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
 61             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
 62             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
 63             return Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter);
 64         }
 65 
 66         /// <summary>
 67         /// 创建lambda表达式:p=>p.propertyName > propertyValue
 68         /// </summary>
 69         /// <typeparam name="T">对象名称(类名)</typeparam>
 70         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
 71         /// <param name="propertyValue">数据值</param>
 72         /// <returns></returns>
 73         public static Expression<Func<T, bool>> CreateGreaterThan<T>(string propertyName, object propertyValue, Type typeValue)
 74         {
 75             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
 76             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
 77             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
 78             return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter);
 79         }
 80 
 81         /// <summary>
 82         /// 创建lambda表达式:p=>p.propertyName小于propertyValue 
 83         /// </summary>
 84         /// <typeparam name="T">对象名称(类名)</typeparam>
 85         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
 86         /// <param name="propertyValue">数据值</param>
 87         /// <returns></returns>
 88         public static Expression<Func<T, bool>> CreateLessThan<T>(string propertyName, object propertyValue, Type typeValue)
 89         {
 90             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
 91             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
 92             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
 93             return Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter);
 94         }
 95 
 96         /// <summary>
 97         /// 创建lambda表达式:p=>p.propertyName >= propertyValue
 98         /// </summary>
 99         /// <typeparam name="T">对象名称(类名)</typeparam>
100         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
101         /// <param name="propertyValue">数据值</param>
102         /// <returns></returns>
103         public static Expression<Func<T, bool>> CreateGreaterThanOrEqual<T>(string propertyName, object propertyValue, Type typeValue)
104         {
105             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
106             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
107             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
108             return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter);
109         }
110 
111         /// <summary>
112         /// 创建lambda表达式:p=> p.propertyName 小于= propertyValue 
113         /// </summary>
114         /// <typeparam name="T">对象名称(类名)</typeparam>
115         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
116         /// <param name="propertyValue">数据值</param>
117         /// <returns></returns>
118         public static Expression<Func<T, bool>> CreateLessThanOrEqual<T>(string propertyName, object propertyValue, Type typeValue)
119         {
120             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");//创建参数p
121             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
122             ConstantExpression constant = Expression.Constant(propertyValue, typeValue);//创建常数
123             return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter);
124         }
125 
126         /// <summary>
127         /// 创建lambda表达式:p=>p.propertyName.Contains(propertyValue)
128         /// </summary>
129         /// <typeparam name="T">对象名称(类名)</typeparam>
130         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
131         /// <param name="propertyValue">数据值</param>
132         /// <returns></returns>
133         public static Expression<Func<T, bool>> GetContains<T>(string propertyName, string propertyValue)
134         {
135             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
136             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
137             MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
138             ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
139             return Expression.Lambda<Func<T, bool>>(Expression.Call(member, method, constant), parameter);
140         }
141 
142         /// <summary>
143         /// 创建lambda表达式:!(p=>p.propertyName.Contains(propertyValue))
144         /// </summary>
145         /// <typeparam name="T">对象名称(类名)</typeparam>
146         /// <param name="propertyName">字段名称(数据库中字段名称)</param>
147         /// <param name="propertyValue">数据值</param>
148         /// <returns></returns>
149         public static Expression<Func<T, bool>> GetNotContains<T>(string propertyName, string propertyValue)
150         {
151             ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
152             MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
153             MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
154             ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
155             return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
156         }
157 
158         /// <summary>
159         /// 功能描述:拼接Or
160         /// 作  者:beck.huang
161         /// 创建日期:2018-11-30 15:35:10
162         /// 任务编号:好餐谋后台管理系统
163         /// </summary>
164         /// <param name="expression1">expression1</param>
165         /// <param name="expression2">expression2</param>
166         /// <returns>返回值</returns>
167         public static Expression<Func<T, bool>> Or<T>(Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
168         {
169             return Compose(expression1, expression2, Expression.OrElse);
170         }
171 
172         /// <summary>
173         /// 功能描述:拼接And
174         /// 作  者:beck.huang
175         /// 创建日期:2018-11-30 15:35:18
176         /// 任务编号:好餐谋后台管理系统
177         /// </summary>
178         /// <param name="expression1">expression1</param>
179         /// <param name="expression2">expression2</param>
180         /// <returns>返回值</returns>
181         public static Expression<Func<T, bool>> And<T>(Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
182         {
183             return Compose(expression1, expression2, Expression.AndAlso);
184         }
185 
186         /// <summary>
187         /// 功能描述:合并2个表达式
188         /// 作  者:beck.huang
189         /// 创建日期:2018-11-30 15:35:26
190         /// 任务编号:好餐谋后台管理系统
191         /// </summary>
192         /// <param name="first">first</param>
193         /// <param name="second">second</param>
194         /// <param name="merge">merge</param>
195         /// <returns>返回值</returns>
196         public static Expression<T> Compose<T>(Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
197         {
198             var map = first.Parameters
199                 .Select((f, i) => new { f, s = second.Parameters[i] })
200                 .ToDictionary(p => p.s, p => p.f);
201             var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
202             return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
203         }
204         private class ParameterRebinder : ExpressionVisitor
205         {
206             readonly Dictionary<ParameterExpression, ParameterExpression> map;
207             /// <summary>
208             /// Initializes a new instance of the <see cref="ParameterRebinder"/> class.
209             /// </summary>
210             /// <param name="map">The map.</param>
211             ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
212             {
213                 this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
214             }
215             /// <summary>
216             /// Replaces the parameters.
217             /// </summary>
218             /// <param name="map">The map.</param>
219             /// <param name="exp">The exp.</param>
220             /// <returns>Expression</returns>
221             public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
222             {
223                 return new ParameterRebinder(map).Visit(exp);
224             }
225             protected override Expression VisitParameter(ParameterExpression p)
226             {
227                 ParameterExpression replacement;
228 
229                 if (map.TryGetValue(p, out replacement))
230                 {
231                     p = replacement;
232                 }
233                 return base.VisitParameter(p);
234             }
235         }
236     }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Asp.Net Core 扩展 Linq,简化自定义
在 Asp.Net Core 开发中或者其他的后端开发中都会有一个需求(尤其对于中台或者后台管理),那就是展示数据列表;当然不是普普通通的数据列表展示,而是需要进行排序、分页、查询关键字来获取列表。
SpiritLing
2021/03/16
1.7K0
学习表达式树笔记 原
文章地址:  http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html
申君健
2018/09/21
4490
表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数
两种方式都是生成 ParameterExpression 类型 Parameter() 和 Variable() 都具有两个重载。他们创建一个 ParameterExpression节点,该节点可用于标识表达式树中的参数或变量。
痴者工良
2021/04/26
1K0
c#表达式树入门,看这个就够了
ps:问: 反射有3种方式,一个是获取值,一个是赋值,一个是调用方法 (如构造器 静态方法 普通方法等),哪个才是性能元凶
洪移潮
2024/10/30
1330
表达式目录树的应用
明志德道
2023/10/21
1630
原 Expression Trees学习
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Windows.Forms; using System.Threading; namespace Expressionss
魂祭心
2018/05/17
8340
基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
https://www.cnblogs.com/neozhu/p/13174234.html
阿新
2020/06/23
9730
由浅入深表达式树(二)遍历表达式树
  为什么要学习表达式树?表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。LINQ to SQL就是通过把表达式树翻译成SQL来实现的,所以了解表达树有助于我们更好的理解 LINQ to SQL,同时如果你有兴趣,可以用它创造出很多有意思的东西来。   表达式树是随着.NET 3.5推出的,所以现在也不算什么新技术了。但是不知道多少人是对它理解的很透彻, 在上一篇Lambda表达式的回复中就看的出大家对Lambd
用户1153966
2018/03/14
1.2K0
由浅入深表达式树(二)遍历表达式树
C# 根据前台传入实体名称,动态查询数据
项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser
郑子铭
2023/08/29
2990
C# 根据前台传入实体名称,动态查询数据
Linq快速入门——Lambda表达式的前世今生
Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托。 何为委托 匿名方法 Lambda表达式 扩展方法 泛型委托 A Simple Lambda Demo Lambda表达式树 何为委托 委托非常好理解,类似于C++里面的函数指针(指向了一个方法),并且委托约束了待指向方法的签名(由返回类型和参数组成)。 using System; using System.Collections.Generic; using Syst
用户1161731
2018/01/11
1.3K0
Linq快速入门——Lambda表达式的前世今生
Expression 表达式树学习整理
整理了一下表达式树的一些东西,入门足够了 先从ConstantExpression 开始一步一步的来吧  它表示具有常量值的表达式 我们选建一个控制台应用程序 ConstantExpression _constExp = Expression.Constant("aaa",typeof(string));//一个常量 //Console.Writeline("aaa"); MethodCallExpression _methodCall
lpxxn
2018/01/31
7200
Expression 表达式树学习整理
表达式树练习实践:变量、常量与赋值
C#的基本值类型有:bool、byte、char、double、float、int、long等(C#中,数组属于引用类型)。
痴者工良
2021/04/26
5920
C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解
笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~
痴者工良
2021/04/26
1.7K0
学习ExpressionTree(做装配脑袋出的练习题)
1 // 第一题:画出下列表达式的表达式树。一开始,您很可能不知道某些操作其实也是表达式(比如取数组的运算符a[2]),不过没有关系,后面的习题将帮你验证这一点。 2 3 //-a 4 ParameterExpression e1 = Expression.Variable(typeof(int), "a"); 5 UnaryExpression u = Expression.Negate(e1);/
Jerremy
2022/05/09
1790
表达式树练习实践:C# 五类运算符的表达式树表达
这些运算符根据参数的多少,可以分作一元运算符、二元运算符、三元运算符。本文将围绕这些运算符,演示如何使用表达式树进行操作。
痴者工良
2021/04/26
7940
C# 反射高级用法
反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。反射是一种在.NET Framework中广泛使用的技术,它是实现上述特性的基础,非常重要。
郑子铭
2023/08/30
2810
C# 反射高级用法
了解C#的Expression
我们书接上文,我们在了解LINQ下面有说到在本地查询IEnumerbale主要是用委托来作为传参,而解析型查询 IQueryable则用Expression来作为传参:
ryzenWzd
2021/12/14
5300
了解C#的Expression
Lambda转sql部分代码保存
1 public class SqlExpressionTree 2 { 3 public string GetQuerySql<T>(Expression<Func<T, bool>> condi) 4 { 5 string condition = "select * from "+typeof(T).Name+" "+ typeof(T).Name + " where "; 6 Bi
蓝夏
2022/03/10
7780
C#中的表达式树
在面向对象的程序设计中,接口是一种重要的语言特性。在 C# 中,接口(interface)是一种特殊的类型,它定义了一个类或结构体应该支持的一组方法、属性和事件。接口提供了一种可扩展和松散耦合的方式来定义程序设计的契约,常用于实现多态和组件化开发。本文将从架构师的角度深入分析 C# 中的接口类型和使用场景,并以 C# 代码实例来说明。
软件架构师Michael
2024/03/13
2260
表达式树练习实践:C#判断语句
If 语句,使用 IfThen(Expression test, Expression ifTrue); 来表达
痴者工良
2021/04/26
5360
相关推荐
Asp.Net Core 扩展 Linq,简化自定义
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验