/// <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); }
/// <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); }
/// <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())); }
/// <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"); }