Ejemplo n.º 1
0
        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) }));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 9
0
 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));
        }