public override Expression Visit(Expression node) { switch (node) { case EnumerableRelationalQueryExpression enumerableRelationalQueryExpression: { var selectExpression = enumerableRelationalQueryExpression.SelectExpression; var commandBuilderLambda = queryTranslatingExpressionVisitorFactory.Create().Translate(selectExpression); var sequenceType = node.Type.GetSequenceType(); var materializer = Visit(materializerGeneratingExpressionVisitor.Visit(selectExpression)); return(Expression.Call( (enumerableRelationalQueryExpression.TransformationMethod ?? asQueryableMethodInfo.MakeGenericMethod(sequenceType)), Expression.Call( executionContextParameter, executeEnumerableMethodInfo.MakeGenericMethod(sequenceType), commandBuilderLambda, materializer))); } case SingleValueRelationalQueryExpression singleValueRelationalQueryExpression: { var selectExpression = singleValueRelationalQueryExpression.SelectExpression; var commandBuilderLambda = queryTranslatingExpressionVisitorFactory.Create().Translate(selectExpression); var materializer = Visit(materializerGeneratingExpressionVisitor.Visit(selectExpression)); return(singleValueRelationalQueryExpression.Type.IsScalarType() ? Expression.Call( executionContextParameter, executeScalarMethodInfo.MakeGenericMethod(node.Type), commandBuilderLambda) : Expression.Call( executionContextParameter, executeComplexMethodInfo.MakeGenericMethod(node.Type), commandBuilderLambda, materializer)); } default: { return(base.Visit(node)); } } }