/// <summary>
        /// 简化节点,然后对简化的表达式调用访问者委托。该方法在节点不可简化时引发异常。
        /// </summary>
        /// <returns>
        /// 要访问的表达式,或应在树中替换此表达式的表达式。
        /// </returns>
        /// <param name="visitor"><see cref="T:System.Func`2"/> 的一个实例。</param>
        protected override Expression VisitChildren(ExpressionVisitor visitor)
        {
            var newArguments = visitor.VisitAndConvert(_arguments, "VisitChildren");

            return newArguments != _arguments
                ? new SqlFunctionExpression(FunctionName, newArguments, Type)
                : this;
        }
        protected override Expression VisitChildren(ExpressionVisitor visitor)
        {
            var arguments = visitor.VisitAndConvert(new ReadOnlyCollection<Expression>(_arguments), "VisitChildren");

            return arguments != Arguments
                ? new SqlFunctionExpression(FunctionName, arguments, Type)
                : this;
        }
        protected override Expression VisitChildren(ExpressionVisitor visitor)
        {
            var newObject = visitor.Visit(MethodCall.Object);
            var newArguments = visitor.VisitAndConvert(MethodCall.Arguments, "VisitChildren");

            if (newObject != MethodCall.Object
                || newArguments != MethodCall.Arguments)
            {
                return new MethodCallEvaluationPreventingExpression(
                    Call(newObject, MethodCall.Method, newArguments));
            }

            return this;
        }
예제 #4
0
        public static ParameterExpression[] VisitParameters(ExpressionVisitor visitor, IParameterProvider nodes, string callerName)
        {
            ParameterExpression[] newNodes = null;
            for (int i = 0, n = nodes.ParameterCount; i < n; i++)
            {
                ParameterExpression curNode = nodes.GetParameter(i);
                ParameterExpression node = visitor.VisitAndConvert(curNode, callerName);

                if (newNodes != null)
                {
                    newNodes[i] = node;
                }
                else if (!object.ReferenceEquals(node, curNode))
                {
                    newNodes = new ParameterExpression[n];
                    for (int j = 0; j < i; j++)
                    {
                        newNodes[j] = nodes.GetParameter(j);
                    }
                    newNodes[i] = node;
                }
            }
            return newNodes;
        }