JoinQueryParameterExpressionReplacer.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. namespace Ant.Query
  7. {
  8. class JoinQueryParameterExpressionReplacer : ExpressionVisitor
  9. {
  10. LambdaExpression _lambda;
  11. Expression[] _expressionSubstitutes;
  12. ParameterExpression _newParameterExpression;
  13. JoinQueryParameterExpressionReplacer(LambdaExpression lambda, Expression[] expressionSubstitutes, ParameterExpression newParameterExpression)
  14. {
  15. this._lambda = lambda;
  16. this._expressionSubstitutes = expressionSubstitutes;
  17. this._newParameterExpression = newParameterExpression;
  18. }
  19. public static LambdaExpression Replace(LambdaExpression lambda, Expression[] expressionSubstitutes, ParameterExpression newParameterExpression)
  20. {
  21. LambdaExpression ret = new JoinQueryParameterExpressionReplacer(lambda, expressionSubstitutes, newParameterExpression).Replace();
  22. return ret;
  23. }
  24. LambdaExpression Replace()
  25. {
  26. Expression lambdaBody = this._lambda.Body;
  27. Expression newBody = this.Visit(lambdaBody);
  28. Type delegateType = typeof(Func<,>).MakeGenericType(this._newParameterExpression.Type, lambdaBody.Type);
  29. LambdaExpression newLambda = Expression.Lambda(delegateType, newBody, this._newParameterExpression);
  30. return newLambda;
  31. }
  32. protected override Expression VisitParameter(ParameterExpression parameter)
  33. {
  34. int parameterIndex = this._lambda.Parameters.IndexOf(parameter);
  35. if (parameterIndex == -1)
  36. {
  37. return parameter;
  38. }
  39. return this._expressionSubstitutes[parameterIndex];
  40. }
  41. }
  42. }