Beispiel #1
0
        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));
            }
            }
        }