Ejemplo n.º 1
0
        private QueryClause VisitSelectMany(MethodCallExpression node, LambdaExpression selector, LambdaExpression projector)
        {
            if (projector != selector)
            {
                Type transparentType = projector.ReturnType;

                if (transparentType.IsCompilerGenerated())
                {
                    // from {item1} in {collection1}
                    // from {item2} in {collection2}
                    ParameterExpression firstVar  = GetVariable(projector.Parameters[0]);
                    ParameterExpression secondVar = GetVariable(projector.Parameters[1]);

                    _clauses.Add(Expressive.From(firstVar, node.Arguments[0]));

                    return(Expressive.From(secondVar, selector.Body));
                }
                else
                {
                    // from {item} in {collection}
                    // select {item}
                    ParameterExpression newItem = GetVariable(projector.Parameters[1]);

                    _clauses.Add(Expressive.From(newItem, selector.Body));

                    return(Expressive.Select(projector.Body));
                }
            }
            return(null);
        }
Ejemplo n.º 2
0
        /// <inheritdoc cref="UnaryExpression.Update(Expression)" select="summary"/>
        public FromClause Update(ParameterExpression variable, Expression enumerable)
        {
            if (Variable == variable && Enumerable == enumerable)
            {
                return(this);
            }

            return(Expressive.From(variable, enumerable));
        }
Ejemplo n.º 3
0
        private QueryClause VisitOrderBy(MethodCallExpression node, LambdaExpression lambda, bool descending)
        {
            if (_clauses.Count == 0)
            {
                _clauses.Add(Expressive.From(GetVariable(lambda.Parameters[1]), node.Arguments[0]));
            }

            return(Expressive.OrderBy(lambda.Body, !descending));
        }
Ejemplo n.º 4
0
        private QueryClause VisitWhere(MethodCallExpression node, LambdaExpression predicate)
        {
            if (_clauses.Count == 0)
            {
                _clauses.Add(Expressive.From(GetVariable(predicate.Parameters[0]), node.Arguments[0]));
            }

            return(Expressive.Where(predicate.Body));
        }
Ejemplo n.º 5
0
        private QueryClause VisitContinuationClause(QueryClauseSyntax clause)
        {
            switch (clause)
            {
            case FromClauseSyntax from:
                return(Expressive.From(null, from.Expression.Accept(this)));

            case LetClauseSyntax let:
                return(Expressive.Let(null, let.Expression.Accept(this)));

            case JoinClauseSyntax join:
                return(Expressive.Join(null, join.InExpression.Accept(this), join.LeftExpression.Accept(this), join.RightExpression.Accept(this)));

            case WhereClauseSyntax where:
                return(Expressive.Where(where.Condition.Accept(this)));

            case OrderByClauseSyntax orderby:
                return(Expressive.OrderBy(Utils.Select(@orderby.Orderings, x => Expressive.Ordering(x.Expression.Accept(this), x.AscendingOrDescendingKeyword.Text == "ascending"))));

            default:
                throw new ArgumentException("Invalid clause.");
            }
        }