zoukankan      html  css  js  c++  java
  • C# Expression扩展

    来源:https://www.cnblogs.com/xcsn/p/7285752.html

    扩展类代码

     1     /// <summary>
     2     ///     Expression表达式扩展操作类
     3     /// 调用方法:repository.GetAll().AsExpandable().Where(predicate)
     4     /// </summary>
     5     public static class ExpressionExtensions
     6     {
     7         /// <summary>
     8         ///     以特定的条件运行组合两个Expression表达式
     9         /// </summary>
    10         /// <typeparam name="T">表达式的主实体类型</typeparam>
    11         /// <param name="first">第一个Expression表达式</param>
    12         /// <param name="second">要组合的Expression表达式</param>
    13         /// <param name="merge">组合条件运算方式</param>
    14         /// <returns>组合后的表达式</returns>
    15         public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second,
    16             Func<Expression, Expression, Expression> merge)
    17         {
    18             var map =
    19                 first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
    20             var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
    21             return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
    22         }
    23 
    24         /// <summary>
    25         ///     以 Expression.AndAlso 组合两个Expression表达式
    26         /// </summary>
    27         /// <typeparam name="T">表达式的主实体类型</typeparam>
    28         /// <param name="first">第一个Expression表达式</param>
    29         /// <param name="second">要组合的Expression表达式</param>
    30         /// <returns>组合后的表达式</returns>
    31         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first,
    32             Expression<Func<T, bool>> second)
    33         {
    34             return first.Compose(second, Expression.AndAlso);
    35         }
    36 
    37         /// <summary>
    38         ///     以 Expression.OrElse 组合两个Expression表达式
    39         /// </summary>
    40         /// <typeparam name="T">表达式的主实体类型</typeparam>
    41         /// <param name="first">第一个Expression表达式</param>
    42         /// <param name="second">要组合的Expression表达式</param>
    43         /// <returns>组合后的表达式</returns>
    44         public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first,
    45             Expression<Func<T, bool>> second)
    46         {
    47             return first.Compose(second, Expression.OrElse);
    48         }
    49 
    50         private class ParameterRebinder : ExpressionVisitor
    51         {
    52             private readonly Dictionary<ParameterExpression, ParameterExpression> _map;
    53 
    54             private ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
    55             {
    56                 _map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
    57             }
    58 
    59             public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map,
    60                 Expression exp)
    61             {
    62                 return new ParameterRebinder(map).Visit(exp);
    63             }
    64 
    65             protected override Expression VisitParameter(ParameterExpression node)
    66             {
    67                 ParameterExpression replacement;
    68                 if (_map.TryGetValue(node, out replacement))
    69                     node = replacement;
    70                 return base.VisitParameter(node);
    71             }
    72         }
    73     }
    View Code

    使用方法: 一定要添加引用扩展类

         Expression<Func<User, bool>> pre;
                pre = s => s.NickName.Contains("");
                pre = pre.Or(s => s.NickName.Contains(""));
                pre = pre.And(s => s.CompanyId == "1");

    来源:https://blog.csdn.net/weixin_30273931/article/details/96499753

    如何获取传入的条件呢。

    Expression<Func<a,bool>> pre //传入条件
    
    ((Closure)pre.Compile().Target).Constants //可以在调试的时候看到属性值。由于是Object类型的,需要反射获取。 请转到相关博客:https://www.cnblogs.com/Alex-Mercer/p/12893184.html
    

      

  • 相关阅读:
    1.求整数最大的连续0的个数 BinaryGap Find longest sequence of zeros in binary representation of an integer.
    JTree实例
    java发送邮件完整实例 java邮件工具类
    oracle存储过程中文乱码问题
    黑马day16 jquery&amp;内容过滤选择器&amp;可见度选择器
    隐性反馈行为数据的协同过滤推荐算法
    ACdream 1083 有向无环图dp
    正則表達式
    hdu 2209 bfs+状压
    action属性注入为null
  • 原文地址:https://www.cnblogs.com/Alex-Mercer/p/11699672.html
Copyright © 2011-2022 走看看