public static Func <Expression, Expression, BinaryExpression> GetCombineExpressionDelegate(this ExpressionCombine combinor) { switch (combinor) { case ExpressionCombine.And: return(Expression.And); case ExpressionCombine.Or: return(Expression.Or); default: throw new NotImplementedException(); } }
public static Expression <Func <T1, T2> > Combine <T1, T2>(this Expression <Func <T1, T2> > first, Expression <Func <T1, T2> > second, ExpressionCombine combinor) { var param = Expression.Parameter(typeof(T1), "x"); var newFirst = first.ReplaceParameter(param); var newSecond = second.ReplaceParameter(param); var expressionCombinor = combinor.GetCombineExpressionDelegate(); var combinedExpression = expressionCombinor(newFirst.Body, newSecond.Body); return(Expression.Lambda <Func <T1, T2> >(combinedExpression, param)); }