C#中Lambda表达式动态拼接生成工具类
生活随笔
收集整理的這篇文章主要介紹了
C#中Lambda表达式动态拼接生成工具类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文代碼轉自這篇文章,先做下記錄。
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">參數(shù)類型</typeparam>/// <typeparam name="TKey">返回類型</typeparam>/// <param name="propName">屬性名</param>/// <returns></returns>private static Expression<Func<T, TKey>> Order<TKey>(string propName){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個屬性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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> Equal(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> NotEqual(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個不相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> LessThan(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個不相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個不相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個不相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue);// 創(chuàng)建一個不相等比較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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValues">屬性值數(shù)組</param>/// <returns></returns>public static Expression<Func<T, bool>> In(string propName, string[] propValues){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t"); // left// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)Expression constant = Expression.Constant(false);// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });foreach (string item in propValues){// 創(chuàng)建一個帶參數(shù)方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right// 連接參數(shù)方法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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValues">屬性值數(shù)組</param>/// <returns></returns>public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)Expression constant = Expression.Constant(false);// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });foreach (string item in propValues){// 創(chuàng)建一個帶參數(shù)方法ExpressionMethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right// 連接參數(shù)方法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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> Contains(string propName, string propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });// 創(chuàng)建一個帶參數(shù)方法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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> StartWith(string propName, string propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });// 創(chuàng)建一個帶參數(shù)方法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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> EndsWith(string propName, string propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });// 創(chuàng)建一個帶參數(shù)方法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">參數(shù)類型</typeparam>/// <param name="propName">屬性名稱</param>/// <param name="propValue">屬性值</param>/// <returns></returns>public static Expression<Func<T, bool>> NotContains(string propName, string propValue){// 創(chuàng)建節(jié)點參數(shù)tParameterExpression parameter = Expression.Parameter(typeof(T), "t");// 創(chuàng)建一個成員(字段/屬性)MemberExpression member = Expression.PropertyOrField(parameter, propName);// 創(chuàng)建一個常數(shù)ConstantExpression constant = Expression.Constant(propValue, typeof(string));// 創(chuàng)建一個方法MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });// 創(chuàng)建一個帶參數(shù)方法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){// 創(chuàng)建參數(shù)表達式InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());// 創(chuàng)建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){// 創(chuàng)建參數(shù)表達式InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());// 創(chuàng)建or運算BinaryExpression binary = Expression.Or(left.Body, invocation);// 生成lambda表達式return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);}}?
總結
以上是生活随笔為你收集整理的C#中Lambda表达式动态拼接生成工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shiro并发登录人数控制遇到的问题和解
- 下一篇: C#中利用Linq.Dynamic实现简