コード例 #1
0
        // Constructors

        public ProjectionExpression(
            Type type,
            ItemProjectorExpression itemProjectorExpression,
            Dictionary <Parameter <Tuple>, Tuple> tupleParameterBindings)
            : this(type, itemProjectorExpression, tupleParameterBindings, ResultAccessMethod.All)
        {
        }
コード例 #2
0
 public ProjectionExpression(
     Type type,
     ItemProjectorExpression itemProjectorExpression,
     Dictionary <Parameter <Tuple>, Tuple> tupleParameterBindings,
     ResultAccessMethod resultAccessMethod)
     : base(ExtendedExpressionType.Projection, type)
 {
     ItemProjector          = itemProjectorExpression;
     ResultAccessMethod     = resultAccessMethod;
     TupleParameterBindings = new Dictionary <Parameter <Tuple>, Tuple>(tupleParameterBindings);
 }
コード例 #3
0
        public virtual Expression Remap(int[] map, Dictionary <Expression, Expression> processedExpressions)
        {
            // Don't check CanRemap - Remap always.

            // Save Subquery parameter
            var  remapContext  = RemapScope.CurrentContext;
            bool isTopSubquery = remapContext.SubqueryParameterExpression == null;

            if (isTopSubquery)
            {
                remapContext.SubqueryParameterExpression = OuterParameter;
            }

            // Remap recordset parameters
            var visitor         = new ApplyParameterAccessVisitor(ApplyParameter, (mc, index) => Call(mc.Object, mc.Method, Constant(map.IndexOf(index))));
            var providerVisitor = new CompilableProviderVisitor((provider, expression) => visitor.Visit(expression));
            var newDataSource   = providerVisitor.VisitCompilable(ProjectionExpression.ItemProjector.DataSource);

            // Remap Field parametrized parameters
            var item = GenericExpressionVisitor <IMappedExpression> .Process(ProjectionExpression.ItemProjector.Item, mapped => {
                var parametrizedExpression = mapped as ParameterizedExpression;
                if (parametrizedExpression != null && parametrizedExpression.OuterParameter == OuterParameter)
                {
                    return(mapped.Remap(map, new Dictionary <Expression, Expression>()));
                }
                return((Expression)mapped);
            });

            var newItemProjector        = new ItemProjectorExpression(item, newDataSource, ProjectionExpression.ItemProjector.Context);
            var newProjectionExpression = new ProjectionExpression(ProjectionExpression.Type, newItemProjector, ProjectionExpression.TupleParameterBindings);
            var result = new SubQueryExpression(Type, OuterParameter, DefaultIfEmpty, newProjectionExpression, ApplyParameter, ExtendedType);

            processedExpressions.Add(this, result);

            // Restore subquery parameter
            if (isTopSubquery)
            {
                remapContext.SubqueryParameterExpression = null;
            }

            return(result);
        }