public static Expression <Func <TSource, bool> > And <TSource>(this Expression <Func <TSource, bool> > a, Expression <Func <TSource, bool> > b) { Type typeFromHandle = typeof(TSource); ParameterExpression parameterExpression = Expression.Parameter(typeFromHandle, "root"); Expression left = ParameterExpressionReplacer.Replace(a.Body, parameterExpression); Expression right = ParameterExpressionReplacer.Replace(b.Body, parameterExpression); BinaryExpression body = Expression.And(left, right); return(Expression.Lambda <Func <TSource, bool> >(body, new ParameterExpression[] { parameterExpression })); }
public static LambdaExpression And(this LambdaExpression a, LambdaExpression b) { if (a == null) { return(b); } if (b == null) { return(a); } Type rootType = a.Parameters[0].Type; var memberParam = Expression.Parameter(rootType, "root"); var aNewBody = ParameterExpressionReplacer.Replace(a.Body, memberParam); var bNewBody = ParameterExpressionReplacer.Replace(b.Body, memberParam); var newBody = Expression.And(aNewBody, bNewBody); var lambda = Expression.Lambda(a.Type, newBody, memberParam); return(lambda); }