// Constructors public ProjectionExpression( Type type, ItemProjectorExpression itemProjectorExpression, Dictionary <Parameter <Tuple>, Tuple> tupleParameterBindings) : this(type, itemProjectorExpression, tupleParameterBindings, ResultAccessMethod.All) { }
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); }
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); }