Beispiel #1
0
        /// <summary>
        /// Combines the first expression with the second using the specified merge function.
        /// </summary>
        static Expression <T> Compose <T>(this Expression <T> first, Expression <T> second, Func <Expression, Expression, Expression> merge)
        {
            // zip parameters (map from parameters of second to parameters of first)
            var map = first.Parameters
                      .Select((f, i) => new { f, s = second.Parameters[i] })
                      .ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with the parameters in the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // create a merged lambda expression with parameters from the first expression
            return(Expression.Lambda <T>(merge(first.Body, secondBody), first.Parameters));
        }
Beispiel #2
0
 /// <summary>
 /// 拼接or 条件语句
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="first"></param>
 /// <param name="second"></param>
 /// <returns></returns>
 public static Expression <Func <T, bool> > Or <T>(this Expression <Func <T, bool> > first, Expression <Func <T, bool> > second)
 {
     return(ParameterRebinder.Compose(first, second, Expression.Or));
 }