private TranslatedQuery PrepareSubqueryParameters(SubQueryExpression subQueryExpression, out Parameter <Tuple> parameterOfTuple, out Type elementType, out ProjectionExpression projection) { // 1. Rewrite recordset and ItemProjector to parameter<tuple> var subqueryTupleParameter = context.GetTupleParameter(subQueryExpression.OuterParameter); var newDataSource = ApplyParameterToTupleParameterRewriter.Rewrite( subQueryExpression.ProjectionExpression.ItemProjector.DataSource, subqueryTupleParameter, subQueryExpression.ApplyParameter); var newItemProjectorBody = ApplyParameterToTupleParameterRewriter.Rewrite( subQueryExpression.ProjectionExpression.ItemProjector.Item, subqueryTupleParameter, subQueryExpression.ApplyParameter); var itemProjector = new ItemProjectorExpression(newItemProjectorBody, newDataSource, subQueryExpression.ProjectionExpression.ItemProjector.Context); parameterOfTuple = context.GetTupleParameter(subQueryExpression.OuterParameter); // 2. Add only parameter<tuple>. Tuple value will be assigned // at the moment of materialization in SubQuery constructor projection = new ProjectionExpression( subQueryExpression.ProjectionExpression.Type, itemProjector, subQueryExpression.ProjectionExpression.TupleParameterBindings, subQueryExpression.ProjectionExpression.ResultType); // 3. Make translation elementType = subQueryExpression.ProjectionExpression.ItemProjector.Item.Type; var resultType = SequenceHelper.GetSequenceType(elementType); var translateMethod = Translator.TranslateMethod.MakeGenericMethod(new[] { resultType }); return((TranslatedQuery)translateMethod.Invoke(context.Translator, new object[] { projection, tupleParameters.AddOne(parameterOfTuple) })); }
public static MaterializationInfo MakeMaterialization(ItemProjectorExpression projector, TranslatorContext context, IEnumerable <Parameter <Tuple> > tupleParameters) { var tupleParameter = Expression.Parameter(typeof(Tuple), "tuple"); var materializationContextParameter = Expression.Parameter(typeof(ItemMaterializationContext), "mc"); var visitor = new ExpressionMaterializer(tupleParameter, context, materializationContextParameter, tupleParameters); var lambda = FastExpression.Lambda(visitor.Visit(projector.Item), tupleParameter, materializationContextParameter); var count = visitor.entityRegistry.Count; return(new MaterializationInfo(count, lambda)); }
protected override Expression VisitProjectionExpression(ProjectionExpression projectionExpression) { var item = Visit(projectionExpression.ItemProjector.Item); var provider = providerVisitor.VisitCompilable(projectionExpression.ItemProjector.DataSource); var providerChanged = provider != projectionExpression.ItemProjector.DataSource; var itemChanged = item != projectionExpression.ItemProjector.Item; if (providerChanged || itemChanged) { var itemProjector = new ItemProjectorExpression(item, provider, projectionExpression.ItemProjector.Context); return(new ProjectionExpression( projectionExpression.Type, itemProjector, projectionExpression.TupleParameterBindings, projectionExpression.ResultAccessMethod)); } return(projectionExpression); }
protected override Expression VisitSubQueryExpression(SubQueryExpression expression) { var newProvider = Rewrite(expression.ProjectionExpression.ItemProjector.DataSource, parameterOfTuple, applyParameter); var newItemProjectorBody = Visit(expression.ProjectionExpression.ItemProjector.Item); if (newProvider != expression.ProjectionExpression.ItemProjector.DataSource || newItemProjectorBody != expression.ProjectionExpression.ItemProjector.Item) { var newItemProjector = new ItemProjectorExpression(newItemProjectorBody, newProvider, expression.ProjectionExpression.ItemProjector.Context); var newProjectionExpression = new ProjectionExpression( expression.ProjectionExpression.Type, newItemProjector, expression.ProjectionExpression.TupleParameterBindings, expression.ProjectionExpression.ResultType); return(new SubQueryExpression( expression.Type, expression.OuterParameter, expression.DefaultIfEmpty, newProjectionExpression, expression.ApplyParameter, expression.ExtendedType)); } return(expression); }
private ProjectionExpression GetIndexBinding(LambdaExpression le, ref ProjectionExpression sequence) { if (le.Parameters.Count == 2) { var indexDataSource = sequence.ItemProjector.DataSource.RowNumber(context.GetNextColumnAlias()); var columnExpression = ColumnExpression.Create(typeof(long), indexDataSource.Header.Columns.Count - 1); var indexExpression = Expression.Subtract(columnExpression, Expression.Constant(1l)); var itemExpression = Expression.Convert(indexExpression, typeof(int)); var indexItemProjector = new ItemProjectorExpression(itemExpression, indexDataSource, context); var indexProjectionExpression = new ProjectionExpression(typeof(long), indexItemProjector, sequence.TupleParameterBindings); var sequenceItemProjector = sequence.ItemProjector.Remap(indexDataSource, 0); sequence = new ProjectionExpression( sequence.Type, sequenceItemProjector, sequence.TupleParameterBindings, sequence.ResultType); return(indexProjectionExpression); } return(null); }
protected override Expression VisitGroupingExpression(GroupingExpression expression) { var newProvider = Rewrite(expression.ProjectionExpression.ItemProjector.DataSource, oldApplyParameter, newApplyParameter); var newItemProjectorBody = Visit(expression.ProjectionExpression.ItemProjector.Item); var newKeyExpression = Visit(expression.KeyExpression); if (newProvider != expression.ProjectionExpression.ItemProjector.DataSource || newItemProjectorBody != expression.ProjectionExpression.ItemProjector.Item || newKeyExpression != expression.KeyExpression) { var newItemProjector = new ItemProjectorExpression(newItemProjectorBody, newProvider, expression.ProjectionExpression.ItemProjector.Context); var newProjectionExpression = new ProjectionExpression( expression.ProjectionExpression.Type, newItemProjector, expression.ProjectionExpression.TupleParameterBindings, expression.ProjectionExpression.ResultType); return(new GroupingExpression( expression.Type, expression.OuterParameter, expression.DefaultIfEmpty, newProjectionExpression, expression.ApplyParameter, expression.KeyExpression, expression.SelectManyInfo)); } return(expression); }
protected override Expression VisitItemProjectorExpression(ItemProjectorExpression itemProjectorExpression) { throw Exceptions.InternalError(String.Format(Strings.ExXDoesNotSupportX, typeof(PersistentExpressionVisitor), typeof(ItemProjectorExpression)), OrmLog.Instance); }
public ItemProjectorExpression GetBoundItemProjector(ParameterExpression parameter, ItemProjectorExpression itemProjector) { ItemProjectorExpression result; if (!boundItemProjectors.TryGetValue(parameter, out result)) { result = itemProjector.BindOuterParameter(parameter); boundItemProjectors.Add(parameter, result); } return(result); }
protected virtual Expression VisitItemProjectorExpression(ItemProjectorExpression itemProjectorExpression) { return(itemProjectorExpression); }
private EntityExpressionJoiner(Translator translator, ItemProjectorExpression itemProjectorExpression) { this.translator = translator; this.itemProjectorExpression = itemProjectorExpression; }
public static ItemProjectorExpression JoinEntities(Translator translator, ItemProjectorExpression itemProjectorExpression) { var item = new EntityExpressionJoiner(translator, itemProjectorExpression).Visit(itemProjectorExpression.Item); return(new ItemProjectorExpression(item, itemProjectorExpression.DataSource, itemProjectorExpression.Context)); }