Ejemplo n.º 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(LinqSelectManyExpression expression)
        {
            var source = this.EvaluateCollection(expression.Source);
            var collectionElementType = ((QueryCollectionType)expression.CollectionSelector.Body.ExpressionType).ElementType;
            var collections           = source.Elements.Select(v => new { Element = v, Collection = (QueryCollectionValue)this.EvaluateLambda <QueryValue>(expression.CollectionSelector, v) });

            var flattenedStructure = new List <KeyValuePair <QueryValue, QueryValue> >();

            foreach (var collectionStructure in collections)
            {
                foreach (var innerCollectionElement in collectionStructure.Collection.Elements)
                {
                    flattenedStructure.Add(new KeyValuePair <QueryValue, QueryValue>(collectionStructure.Element, innerCollectionElement));
                }
            }

            if (expression.ResultSelector != null)
            {
                var results = flattenedStructure.Select(v => this.EvaluateLambda <QueryValue>(expression.ResultSelector, v.Key, v.Value));

                return(expression.ResultSelector.Body.ExpressionType.CreateCollectionType().CreateCollectionWithValues(results));
            }
            else
            {
                return(collectionElementType.CreateCollectionType().CreateCollectionWithValues(flattenedStructure.Select(s => s.Value)));
            }
        }
Ejemplo n.º 2
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(LinqSelectManyExpression expression)
        {
            var source             = this.ReplaceExpression(expression.Source);
            var collectionSelector = (LinqLambdaExpression)this.ReplaceExpression(expression.CollectionSelector);
            var resultSelector     = expression.ResultSelector != null ? (LinqLambdaExpression)this.ReplaceExpression(expression.ResultSelector) : null;

            if (HasChanged(expression.Source, source) || HasChanged(expression.CollectionSelector, collectionSelector) || HasChanged(expression.ResultSelector, resultSelector))
            {
                return(new LinqSelectManyExpression(source, collectionSelector, resultSelector, expression.ExpressionType));
            }
            else
            {
                return(expression);
            }
        }
Ejemplo n.º 3
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(LinqSelectManyExpression expression)
        {
            var source             = this.GenerateCode(expression.Source);
            var collectionSelector = this.GenerateCode(expression.CollectionSelector);
            var resultSelector     = expression.ResultSelector != null?this.GenerateCode(expression.ResultSelector) : null;

            if (resultSelector != null)
            {
                return(source.Call("SelectMany", collectionSelector, resultSelector));
            }
            else
            {
                return(source.Call("SelectMany", collectionSelector));
            }
        }
Ejemplo n.º 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(LinqSelectManyExpression expression)
        {
            var source                = this.ResolveTypes(expression.Source);
            var sourceType            = ValidateSourceIsACollection(source);
            var collectionSelector    = this.ResolveLambdaTypes(expression.CollectionSelector, sourceType);
            var elementCollectionType = ValidateSourceIsACollection(collectionSelector.Body);

            if (expression.ResultSelector != null)
            {
                var resultSelector = this.ResolveLambdaTypes(expression.ResultSelector, sourceType, elementCollectionType);

                return(new LinqSelectManyExpression(source, collectionSelector, resultSelector, resultSelector.Body.ExpressionType.CreateCollectionType()));
            }
            else
            {
                return(new LinqSelectManyExpression(source, collectionSelector, null, elementCollectionType));
            }
        }
 /// <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(LinqSelectManyExpression expression)
 {
     throw new TaupoNotSupportedException("Query syntax is not supported by Taupo at the moment.");
 }
        /// <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(LinqSelectManyExpression expression)
        {
            var source = this.GenerateCode(expression.Source);
            var collectionSelector = this.GenerateCode(expression.CollectionSelector);
            var resultSelector = expression.ResultSelector != null ? this.GenerateCode(expression.ResultSelector) : null;

            if (resultSelector != null)
            {
                return source.Call("SelectMany", collectionSelector, resultSelector);
            }
            else
            {
                return source.Call("SelectMany", collectionSelector);
            }
        }
 /// <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(LinqSelectManyExpression expression)
 {
     throw new TaupoNotSupportedException("Query syntax is not supported by Taupo at the moment.");
 }