/// <summary>
        /// Replaces the given expression.
        /// </summary>
        /// <param name="expression">Expression to replace.</param>
        /// <returns>Replaced expression.</returns>
        public QueryExpression Visit(QueryFunctionImportCallExpression expression)
        {
            var replacedArguments = this.ReplaceArguments(expression.Arguments);

            if (this.HasChanged(expression.Arguments, replacedArguments))
            {
                return(new QueryFunctionImportCallExpression(expression.ExpressionType, expression.FunctionImport, expression.IsRoot, replacedArguments.ToArray()));
            }

            return(expression);
        }
        /// <summary>
        /// Resolves types for the specified expression.
        /// </summary>
        /// <param name="expression">The expression to resolve types for.</param>
        /// <returns>Expression with resolved types.</returns>
        public QueryExpression Visit(QueryFunctionImportCallExpression expression)
        {
            ExceptionUtilities.CheckObjectNotNull(expression.FunctionImport.ReturnTypes.SingleOrDefault(), "Function import must have return type specified. FunctionImport: '{0}'.", expression.FunctionImport.Name);

            var       resolvedArguments  = this.ResolveTypesForArguments(expression.Arguments);
            var       returnType         = expression.FunctionImport.ReturnTypes.Single();
            QueryType resolvedResultType = this.GetDefaultQueryType(returnType.DataType);

            var resolved = new QueryFunctionImportCallExpression(resolvedResultType, expression.FunctionImport, expression.IsRoot, resolvedArguments);

            return(resolved);
        }
Пример #3
0
        /// <summary>
        /// Evaluates the specified expression.
        /// </summary>
        /// <param name="expression">The expression to evaluate.</param>
        /// <returns>Value of the expression.</returns>
        public QueryValue Visit(QueryFunctionImportCallExpression expression)
        {
            var argumentValues = this.EvaluateArguments(expression.Arguments);
            var result         = expression.ExpressionType.EvaluationStrategy.EvaluateFunctionImport(expression.ExpressionType, expression.FunctionImport, argumentValues);
            var returnType     = expression.FunctionImport.ReturnTypes.Single();

            if (returnType.EntitySet != null)
            {
                result = this.FixupFunctionImportResultEntities(result, returnType.EntitySet.Name);
            }

            return(result);
        }
Пример #4
0
        /// <summary>
        /// Generates System.CodeDom.CodeExpression from the given expression.
        /// </summary>
        /// <param name="expression">Expression from which System.CodeDom.CodeExpression is generated.</param>
        /// <returns>Generated System.CodeDom.CodeExpression.</returns>
        public virtual CodeExpression Visit(QueryFunctionImportCallExpression expression)
        {
            var clrMethod = expression.FunctionImport.Annotations.OfType <ClrMethodAnnotation>().SingleOrDefault();

            ExceptionUtilities.CheckObjectNotNull(clrMethod, "Cannot generate Linq syntax for function import call expression as there is no information about corresponding Clr method. Function: {0}.", expression.FunctionImport.Name);

            var type = new CodeTypeReferenceExpression(clrMethod.FullTypeName);

            var arguments = new List <CodeExpression>();

            if (expression.IsRoot)
            {
                ExceptionUtilities.CheckObjectNotNull(this.QueryProvider, "Cannot generate function import call expression as a root as QueryProvider is not setup.");
                arguments.Add(this.QueryProvider);
            }

            arguments.AddRange(this.GenerateCodeForArguments(expression.Arguments));

            return(type.Call(clrMethod.MethodName, arguments.ToArray()));
        }
Пример #5
0
 /// <summary>
 /// Visits a QueryExpression tree whose root node is the QueryFunctionImportCallExpression.
 /// </summary>
 /// <param name="expression">The root node of the expression tree being visited.</param>
 /// <returns>Uri query string representing the expression.</returns>
 public virtual string Visit(QueryFunctionImportCallExpression expression)
 {
     throw new TaupoNotSupportedException("Not supported");
 }