class RemoveInvokeVisitor<T> : ExpressionVisitor {
private ReadOnlyCollection<ParameterExpression> lambdaParameters;

public RemoveInvokeVisitor(ReadOnlyCollection<ParameterExpression> 
parameters) {
	this.lambdaParameters = parameters;
}

protected override Expression VisitInvocation(InvocationExpression iv) {
var newPars = iv.Arguments;
LambdaExpression lambda = (iv.Expression) as LambdaExpression;
if (lambda != null) {
var oldPars = lambda.Parameters;
ReplaceParametersVisitors replace =
	new ReplaceParametersVisitors(oldPars, newPars);
return this.Visit( replace.ReplaceVisit(lambda.Body) );
}
else {
	return base.VisitInvocation(iv);
}
}

public Expression<T> RemoveInvokeVisit(Expression<T> exp) {
	return (Expression<T>) Visit(exp);
}
}
class ReplaceParametersVisitors : ExpressionVisitor {
private ReadOnlyCollection<Expression> newParameters;
private ReadOnlyCollection<ParameterExpression> oldParameters;
public ReplaceParametersVisitors(
ReadOnlyCollection<ParameterExpression> oldParameters,
ReadOnlyCollection<Expression> newParameters) {
this.newParameters = newParameters;
this.oldParameters = oldParameters;
}

protected override Expression VisitParameter(ParameterExpression p) {
if (oldParameters != null
&& newParameters != null) {
if (oldParameters.Contains(p)) {
	return newParameters[oldParameters.IndexOf(p)];
}
}
return base.VisitParameter(p);
}

public Expression ReplaceVisit(Expression exp) {
	return Visit(exp);
}
}
