/// <summary> /// Evaluates the specified expression. /// </summary> /// <param name="expression">The expression to evaluate.</param> /// <returns>Value of the expression.</returns> public virtual QueryValue Visit(LinqSelectExpression expression) { return(this.EvaluateQueryMethodWithLambdaExpression <QueryValue>( expression, null, (c, l) => c.Select(l, (QueryCollectionType)expression.ExpressionType))); }
/// <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 override CodeExpression Visit(LinqSelectExpression expression) { CodeExpression source = this.GenerateCode(expression.Source); var lambda = this.GenerateCode(expression.Lambda) as CodeLambdaExpression; return(source.Call("Select", lambda)); }
/// <summary> /// Visits a QueryExpression tree whose root node is the LinqSelectExpression. /// </summary> /// <param name="expression">The root node of the expression tree being visited.</param> /// <returns>Uri query string representing the expression.</returns> public override string Visit(LinqSelectExpression expression) { string source = this.ComputeUriInternal(expression.Source); LinqNewExpression newExpression = expression.Lambda.Body as LinqNewExpression; LinqNewInstanceExpression newInstanceExpression = expression.Lambda.Body as LinqNewInstanceExpression; QueryPropertyExpression propertyExpression = expression.Lambda.Body as QueryPropertyExpression; string select = string.Empty; if (propertyExpression != null) { return(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", source, propertyExpression.Name)); } else if (newExpression != null) { select = this.ExpressionConverter.Convert(newExpression); this.SetSelectQueryOption(select); this.hasQueryOption = true; return(string.Format(CultureInfo.InvariantCulture, "{0}{1}", source, string.Empty)); } else if (newInstanceExpression != null) { select = this.ExpressionConverter.Convert(newInstanceExpression); this.SetSelectQueryOption(select); this.hasQueryOption = true; return(string.Format(CultureInfo.InvariantCulture, "{0}{1}", source, string.Empty)); } return(source); }
/// <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(LinqSelectExpression expression) { var source = this.ResolveTypes(expression.Source); var sourceType = ValidateSourceIsACollection(source); var lambda = this.ResolveLambdaTypes(expression.Lambda, sourceType); return(new LinqSelectExpression(source, lambda, lambda.Body.ExpressionType.CreateCollectionType())); }
/// <summary> /// Evaluates the specified expression. /// </summary> /// <param name="expression">The expression to evaluate.</param> /// <returns>Value of the expression.</returns> public override QueryValue Visit(LinqSelectExpression expression) { return(this.VisitCollectionElementPrimitiveOrComplexTypeError( expression, delegate { return base.Visit(expression); })); }
/// <summary> /// Replaces the given expression. /// </summary> /// <param name="expression">The root node of the expression tree being visited.</param> /// <returns> /// Replaced expression. /// </returns> public override QueryExpression Visit(LinqSelectExpression expression) { // in a select, only properties will be sent this.propertyExpressions.Clear(); expression.Lambda.Accept(this); if (this.propertyExpressions.Count == 0) { return(expression.Source); } var newExpression = LinqBuilder.New(this.propertyExpressions.Select(p => this.IdentifierGenerator.GenerateIdentifier("temp")), this.propertyExpressions); var lambda = LinqBuilder.Lambda(newExpression, expression.Lambda.Parameters.ToArray()); return(expression.Source.Select(lambda)); }
/// <summary> /// Visits a QueryExpression tree whose root node is the LinqSelectExpression. /// </summary> /// <param name="expression">The root node of the expression tree being visited.</param> /// <returns>Uri query string representing the expression.</returns> public override string Visit(LinqSelectExpression expression) { string source = this.ComputeUriInternal(expression.Source); LinqNewExpression newExpression = expression.Lambda.Body as LinqNewExpression; LinqNewInstanceExpression newInstanceExpression = expression.Lambda.Body as LinqNewInstanceExpression; QueryPropertyExpression propertyExpression = expression.Lambda.Body as QueryPropertyExpression; string select = string.Empty; if (propertyExpression != null) { return string.Format(CultureInfo.InvariantCulture, "{0}/{1}", source, propertyExpression.Name); } else if (newExpression != null) { select = this.ExpressionConverter.Convert(newExpression); this.SetSelectQueryOption(select); this.hasQueryOption = true; return string.Format(CultureInfo.InvariantCulture, "{0}{1}", source, string.Empty); } else if (newInstanceExpression != null) { select = this.ExpressionConverter.Convert(newInstanceExpression); this.SetSelectQueryOption(select); this.hasQueryOption = true; return string.Format(CultureInfo.InvariantCulture, "{0}{1}", source, string.Empty); } return source; }
/// <summary> /// Visits a QueryExpression tree whose root node is the LinqSelectExpression. /// </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(LinqSelectExpression expression) { throw new TaupoNotSupportedException("Not supported"); }
/// <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 abstract CodeExpression Visit(LinqSelectExpression expression);
/// <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 override CodeExpression Visit(LinqSelectExpression expression) { var source = this.GenerateCode(expression.Source); var prm = expression.Lambda.Parameters.Single(); var codeQuerySource = source as CodeQueryExpression; string inputParameterName = this.GetInputParameterName(codeQuerySource); string groupParameterName = this.GetGroupParameterName(codeQuerySource); var newPrm = new CodeParameterDeclarationExpression(); newPrm = new CodeParameterDeclarationExpression(new CodeImplicitTypeReference(), inputParameterName); this.ParameterNamesDictionary.Add(prm, newPrm); CodeLambdaExpression lambda; try { lambda = (CodeLambdaExpression)this.GenerateCode(expression.Lambda); } finally { this.ParameterNamesDictionary.Remove(prm); } if (codeQuerySource != null) { if (codeQuerySource.GroupByKeySelector == null && codeQuerySource.Select == null) { return(new CodeQueryExpression( inputParameterName, groupParameterName, codeQuerySource.From, codeQuerySource.Where, codeQuerySource.OrderByKeySelectors, codeQuerySource.AreDescending, codeQuerySource.GroupByKeySelector, lambda.Body)); } else { return(new CodeQueryExpression( inputParameterName, groupParameterName, codeQuerySource, null, Enumerable.Empty <CodeExpression>(), Enumerable.Empty <bool>(), null, lambda.Body)); } } else { return(new CodeQueryExpression( inputParameterName, groupParameterName, source, null, Enumerable.Empty <CodeExpression>(), Enumerable.Empty <bool>(), null, lambda.Body)); } }
/// <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 override CodeExpression Visit(LinqSelectExpression expression) { CodeExpression source = this.GenerateCode(expression.Source); var lambda = this.GenerateCode(expression.Lambda) as CodeLambdaExpression; return source.Call("Select", lambda); }
/// <summary> /// Replaces the given expression. /// </summary> /// <param name="expression">The root node of the expression tree being visited.</param> /// <returns>Replaced expression.</returns> public virtual QueryExpression Visit(LinqSelectExpression expression) { return(this.VisitQueryMethodWithLambdaExpression(expression, (s, l, t) => new LinqSelectExpression(s, l, t))); }
/// <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 override CodeExpression Visit(LinqSelectExpression expression) { var source = this.GenerateCode(expression.Source); var prm = expression.Lambda.Parameters.Single(); var codeQuerySource = source as CodeQueryExpression; string inputParameterName = this.GetInputParameterName(codeQuerySource); string groupParameterName = this.GetGroupParameterName(codeQuerySource); var newPrm = new CodeParameterDeclarationExpression(); newPrm = new CodeParameterDeclarationExpression(new CodeImplicitTypeReference(), inputParameterName); this.ParameterNamesDictionary.Add(prm, newPrm); CodeLambdaExpression lambda; try { lambda = (CodeLambdaExpression)this.GenerateCode(expression.Lambda); } finally { this.ParameterNamesDictionary.Remove(prm); } if (codeQuerySource != null) { if (codeQuerySource.GroupByKeySelector == null && codeQuerySource.Select == null) { return new CodeQueryExpression( inputParameterName, groupParameterName, codeQuerySource.From, codeQuerySource.Where, codeQuerySource.OrderByKeySelectors, codeQuerySource.AreDescending, codeQuerySource.GroupByKeySelector, lambda.Body); } else { return new CodeQueryExpression( inputParameterName, groupParameterName, codeQuerySource, null, Enumerable.Empty<CodeExpression>(), Enumerable.Empty<bool>(), null, lambda.Body); } } else { return new CodeQueryExpression( inputParameterName, groupParameterName, source, null, Enumerable.Empty<CodeExpression>(), Enumerable.Empty<bool>(), null, lambda.Body); } }