Exemple #1
0
        private Expression VisitProjection(ProjectionExpression projection, MaterializerBuildingExpressionVisitor visitor)
        {
            switch (projection)
            {
            case ServerProjectionExpression serverProjectionExpression:
            {
                return(visitor.Visit(serverProjectionExpression.ResultLambda.Body));
            }

            case ClientProjectionExpression clientProjectionExpression:
            {
                var server = clientProjectionExpression.ServerProjection;
                var result = clientProjectionExpression.ResultLambda;

                return(Expression.Invoke(result, VisitProjection(server, visitor)));
            }

            case CompositeProjectionExpression compositeProjectionExpression:
            {
                var outer  = VisitProjection(compositeProjectionExpression.OuterProjection, visitor);
                var inner  = VisitProjection(compositeProjectionExpression.InnerProjection, visitor);
                var result = compositeProjectionExpression.ResultLambda;

                return(Expression.Invoke(result, outer, inner));
            }

            default:
            {
                throw new InvalidOperationException();
            }
            }
        }
Exemple #2
0
        public override Expression Visit(Expression node)
        {
            switch (node)
            {
            case SelectExpression selectExpression:
            {
                var readerParameter
                    = Expression.Parameter(typeof(DbDataReader), "dbDataReader");

                var visitor
                    = new MaterializerBuildingExpressionVisitor(
                          translatabilityAnalyzingExpressionVisitor,
                          readValueExpressionFactoryProvider.GetReadValueExpressionFactories(),
                          readerParameter);

                var body = VisitProjection(selectExpression.Projection, visitor);

                return(Expression.Lambda(body, "MaterializeResult", new[] { readerParameter }));
            }

            default:
            {
                return(base.Visit(node));
            }
            }
        }