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