コード例 #1
0
 /// <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)));
 }
コード例 #2
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 override CodeExpression Visit(LinqSelectExpression expression)
        {
            CodeExpression source = this.GenerateCode(expression.Source);
            var            lambda = this.GenerateCode(expression.Lambda) as CodeLambdaExpression;

            return(source.Call("Select", lambda));
        }
コード例 #3
0
ファイル: UriQueryVisitor.cs プロジェクト: zhonli/odata.net
        /// <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);
        }
コード例 #4
0
        /// <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()));
        }
コード例 #5
0
 /// <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);
     }));
 }
コード例 #6
0
        /// <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));
        }
コード例 #7
0
ファイル: UriQueryVisitor.cs プロジェクト: larsenjo/odata.net
        /// <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;
        }
コード例 #8
0
 /// <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");
 }
コード例 #9
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 abstract CodeExpression Visit(LinqSelectExpression expression);
コード例 #10
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 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));
            }
        }
コード例 #11
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 override CodeExpression Visit(LinqSelectExpression expression)
        {
            CodeExpression source = this.GenerateCode(expression.Source);
            var lambda = this.GenerateCode(expression.Lambda) as CodeLambdaExpression;

            return source.Call("Select", lambda);
        }
コード例 #12
0
 /// <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)));
 }
コード例 #13
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 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);
            }
        }