ParameterRebinder.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using System.Collections.Generic;
  2. using System.Linq.Expressions;
  3. namespace Abp.Specifications
  4. {
  5. /// <summary>
  6. /// Represents the parameter rebinder used for rebinding the parameters
  7. /// for the given expressions. This is part of the solution which solves
  8. /// the expression parameter problem when going to Entity Framework.
  9. /// For more information about this solution please refer to http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx.
  10. /// </summary>
  11. internal class ParameterRebinder : ExpressionVisitor
  12. {
  13. private readonly Dictionary<ParameterExpression, ParameterExpression> _map;
  14. internal ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
  15. {
  16. _map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
  17. }
  18. internal static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
  19. {
  20. return new ParameterRebinder(map).Visit(exp);
  21. }
  22. protected override Expression VisitParameter(ParameterExpression p)
  23. {
  24. ParameterExpression replacement;
  25. if (_map.TryGetValue(p, out replacement))
  26. {
  27. p = replacement;
  28. }
  29. return base.VisitParameter(p);
  30. }
  31. }
  32. }