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