/// <summary> /// Replaces Lambda parameter references or transparent scope property accesses over those Lambda /// parameter references with <see cref="InputReferenceExpression"/>s to the appropriate corresponding /// <see cref="QueryableResourceExpression"/>s, based on the 'input' QueryableResourceExpression to which the /// Lambda is logically applied and any enclosing transparent scope applied to that input resource. /// </summary> /// <param name="e">The expression to rebind</param> /// <param name="currentInput"> /// The 'current input' resource - either the root resource or the /// rightmost resource in the navigation chain.</param> /// <param name="inputParameter">The Lambda parameter that represents a reference to the 'input'</param> /// <param name="referencedInputs">A list that will be populated with the resources that were referenced by the rebound expression</param> /// <returns> /// The rebound version of <paramref name="e"/> where MemberExpression/ParameterExpressions that /// represent resource references have been replaced with appropriate InputReferenceExpressions. /// </returns> internal static Expression Bind(Expression e, ResourceExpression currentInput, ParameterExpression inputParameter, List<ResourceExpression> referencedInputs) { Debug.Assert(e != null, "Expression cannot be null"); Debug.Assert(currentInput != null, "A current input resource is required"); Debug.Assert(inputParameter != null, "The input lambda parameter is required"); Debug.Assert(referencedInputs != null, "The referenced inputs list is required"); InputBinder binder = new InputBinder(currentInput, inputParameter); Expression result = binder.Visit(e); referencedInputs.AddRange(binder.referencedInputs); return result; }
/// <summary> /// Replaces Lambda parameter references or transparent scope property accesses over those Lambda /// parameter references with <see cref="InputReferenceExpression"/>s to the appropriate corresponding /// <see cref="QueryableResourceExpression"/>s, based on the 'input' QueryableResourceExpression to which the /// Lambda is logically applied and any enclosing transparent scope applied to that input resource. /// </summary> /// <param name="e">The expression to rebind</param> /// <param name="currentInput"> /// The 'current input' resource - either the root resource or the /// rightmost resource in the navigation chain.</param> /// <param name="inputParameter">The Lambda parameter that represents a reference to the 'input'</param> /// <param name="referencedInputs">A list that will be populated with the resources that were referenced by the rebound expression</param> /// <returns> /// The rebound version of <paramref name="e"/> where MemberExpression/ParameterExpressions that /// represent resource references have been replaced with appropriate InputReferenceExpressions. /// </returns> internal static Expression Bind(Expression e, ResourceExpression currentInput, ParameterExpression inputParameter, List <ResourceExpression> referencedInputs) { Debug.Assert(e != null, "Expression cannot be null"); Debug.Assert(currentInput != null, "A current input resource is required"); Debug.Assert(inputParameter != null, "The input lambda parameter is required"); Debug.Assert(referencedInputs != null, "The referenced inputs list is required"); InputBinder binder = new InputBinder(currentInput, inputParameter); Expression result = binder.Visit(e); referencedInputs.AddRange(binder.referencedInputs); return(result); }