前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c# Lambda扩展

c# Lambda扩展

作者头像
冰封一夏
发布2019-09-11 15:17:45
5910
发布2019-09-11 15:17:45
举报

扩展类

代码语言:javascript
复制
  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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档