public Expression Analyze(ExpressionChain expressionChain, Expression parameter, TranslationContext context) { Expression resultExpression = parameter; Expression last = expressionChain.Last(); foreach (Expression expr in expressionChain) { if (expr == last) context.IsExternalInExpressionChain = true; resultExpression = this.Analyze(expr, resultExpression, context); } return resultExpression; }
/// <summary> /// Builds the ExpressionQuery main Expression, given a Table (or projection) expression /// </summary> /// <param name="expressions"></param> /// <param name="tableExpression"></param> /// <param name="builderContext"></param> /// <returns></returns> protected Expression BuildExpressionQuery(ExpressionChain expressions, Expression tableExpression, BuilderContext builderContext) { var last = expressions.Last(); foreach (var expression in expressions) { if (expression == last) builderContext.IsExternalInExpressionChain = true; builderContext.QueryContext.DataContext.Logger.WriteExpression(Level.Debug, expression); // Convert linq Expressions to QueryOperationExpressions and QueryConstantExpressions // Query expressions language identification var currentExpression = ExpressionLanguageParser.Parse(expression, builderContext); // Query expressions query identification currentExpression = ExpressionDispatcher.Analyze(currentExpression, tableExpression, builderContext); tableExpression = currentExpression; } ExpressionDispatcher.BuildSelect(tableExpression, builderContext); return tableExpression; }