Exemple #1
0
        private static QuerySourceScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QuerySourceScope parentQuerySourceScope,
            DbDataReader dataReader,
            int readerOffset,
            IEntityType entityType)
        {
            var relationalQueryContext = (RelationalQueryContext)queryContext;

            var valueReader
                = relationalQueryContext.ValueReaderFactory
                  .Create(dataReader);

            if (readerOffset > 0)
            {
                valueReader = new OffsetValueReaderDecorator(valueReader, readerOffset);
            }

            return(new QuerySourceScope <TEntity>(
                       querySource,
                       (TEntity)queryContext.QueryBuffer
                       .GetEntity(entityType, valueReader),
                       parentQuerySourceScope));
        }
Exemple #2
0
        private static QuerySourceScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QuerySourceScope parentQuerySourceScope,
            ValueBuffer valueBuffer,
            int valueBufferOffset,
            IEntityType entityType,
            bool queryStateManager,
            EntityKeyFactory entityKeyFactory,
            IReadOnlyList <IProperty> keyProperties,
            Func <ValueBuffer, object> materializer)
            where TEntity : class
        {
            valueBuffer = valueBuffer.UpdateOffset(valueBufferOffset);

            var entityKey
                = entityKeyFactory.Create(entityType, keyProperties, valueBuffer);

            return(new QuerySourceScope <TEntity>(
                       querySource,
                       (TEntity)queryContext.QueryBuffer
                       .GetEntity(
                           entityType,
                           entityKey,
                           new EntityLoadInfo(
                               valueBuffer,
                               materializer),
                           queryStateManager),
                       parentQuerySourceScope));
        }
Exemple #3
0
        private static QuerySourceScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QuerySourceScope parentQuerySourceScope,
            DbDataReader dataReader,
            int readerOffset)
        {
            var relationalQueryContext = (RelationalQueryContext)queryContext;

            var valueReader
                = relationalQueryContext.ValueReaderFactory.Create(dataReader);

            if (readerOffset > 0)
            {
                valueReader = new OffsetValueReaderDecorator(valueReader, readerOffset);
            }

            return(new QuerySourceScope <TEntity>(
                       querySource,
                       // ReSharper disable once AssignNullToNotNullAttribute
                       (TEntity)queryContext.StateManager
                       .GetOrMaterializeEntry(
                           queryContext.Model.GetEntityType(typeof(TEntity)),
                           valueReader).Entity,
                       parentQuerySourceScope));
        }
        protected override Expression VisitMethodCallExpression(MethodCallExpression expression)
        {
            var newArguments = VisitAndConvert(expression.Arguments, "VisitMethodCallExpression");

            if ((expression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateEntityMethodInfo) ||
                 expression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateValueReaderMethodInfo)) &&
                ((ConstantExpression)expression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (Expression.Call(
                         _getValueMethodInfo,
                         expression.Arguments[0],
                         expression.Arguments[2],
                         expression.Arguments[3]));
            }

            if (expression.Method.MethodIsClosedFormOf(
                    QuerySourceScope.GetResultMethodInfo) &&
                ((ConstantExpression)expression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (QuerySourceScope.GetResult(
                         expression.Object,
                         _outerQuerySource,
                         typeof(bool)));
            }

            if (newArguments != expression.Arguments)
            {
                if (expression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod))
                {
                    return(Expression.Call(
                               _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod
                               .MakeGenericMethod(typeof(QuerySourceScope <bool>)),
                               newArguments));
                }

                if (expression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.LinqOperatorProvider.Select))
                {
                    return
                        (Expression.Call(
                             _relationalQueryCompilationContext.LinqOperatorProvider.First
                             .MakeGenericMethod(typeof(bool)),
                             Expression.Call(
                                 _relationalQueryCompilationContext.LinqOperatorProvider.Select
                                 .MakeGenericMethod(
                                     typeof(QuerySourceScope),
                                     typeof(bool)),
                                 newArguments)));
                }

                return(Expression.Call(expression.Method, newArguments));
            }

            return(expression);
        }
 private static QuerySourceScope <TResult> GetValue(
     IQuerySource querySource,
     QuerySourceScope parentQuerySourceScope,
     DbDataReader dataReader)
 {
     return(new QuerySourceScope <TResult>(
                querySource,
                dataReader.GetFieldValue <TResult>(0),
                parentQuerySourceScope));
 }
 private static QuerySourceScope <bool> GetValue(
     IQuerySource querySource,
     QuerySourceScope parentQuerySourceScope,
     DbDataReader dataReader)
 {
     return(new QuerySourceScope <bool>(
                querySource,
                dataReader.GetBoolean(0),
                parentQuerySourceScope));
 }
 private static QuerySourceScope <IValueReader> CreateValueReader(
     IQuerySource querySource,
     QueryContext queryContext,
     QuerySourceScope parentQuerySourceScope,
     DbDataReader dataReader)
 {
     return(new QuerySourceScope <IValueReader>(
                querySource,
                ((RelationalQueryContext)queryContext).ValueReaderFactory.Create(dataReader),
                parentQuerySourceScope));
 }
Exemple #8
0
 private static QuerySourceScope <ValueBuffer> CreateValueBuffer(
     IQuerySource querySource,
     QueryContext queryContext,
     QuerySourceScope parentQuerySourceScope,
     ValueBuffer valueBuffer,
     int valueBufferOffset)
 {
     return(new QuerySourceScope <ValueBuffer>(
                querySource,
                valueBuffer.UpdateOffset(valueBufferOffset),
                parentQuerySourceScope));
 }
Exemple #9
0
        public override Expression VisitExpression(Expression expression)
        {
            if (expression != null &&
                !(expression is QuerySourceReferenceExpression))
            {
                var sqlExpression
                    = _sqlTranslatingExpressionTreeVisitor.VisitExpression(expression);

                if (sqlExpression == null)
                {
                    _requiresClientEval = true;
                }
                else
                {
                    var selectExpression
                        = QueryModelVisitor.TryGetQuery(_querySource);

                    Debug.Assert(selectExpression != null);

                    if (!(expression is NewExpression))
                    {
                        var columnExpression = sqlExpression as ColumnExpression;

                        if (columnExpression != null)
                        {
                            selectExpression.AddToProjection(columnExpression);

                            return(expression);
                        }

                        var index = selectExpression.AddToProjection(sqlExpression);

                        return
                            (QueryModelVisitor.BindReadValueMethod(
                                 expression.Type,
                                 QuerySourceScope.GetResult(
                                     EntityQueryModelVisitor.QuerySourceScopeParameter,
                                     _querySource,
                                     typeof(IValueReader)),
                                 index));
                    }
                }
            }

            return(base.VisitExpression(expression));
        }
Exemple #10
0
        private static QuerySourceScope <TEntity> _IncludeReference <TEntity>(
            QueryContext queryContext,
            QuerySourceScope <TEntity> querySourceScope,
            INavigation navigation,
            DbDataReader dataReader,
            int readerOffset)
        {
            var valueReader
                = ((RelationalQueryContext)queryContext).ValueReaderFactory
                  .Create(dataReader);

            queryContext.QueryBuffer
            .Include(
                querySourceScope._result,
                navigation,
                (_, __) => new[] { new OffsetValueReaderDecorator(valueReader, readerOffset) });

            return(querySourceScope);
        }
        private static QuerySourceScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QuerySourceScope parentQuerySourceScope,
            DbDataReader dataReader,
            int readerOffset,
            IEntityType entityType,
            bool queryStateManager,
            EntityKeyFactory entityKeyFactory,
            IReadOnlyList <IProperty> keyProperties,
            Func <IValueReader, object> materializer)
            where TEntity : class
        {
            var valueReader
                = ((RelationalQueryContext)queryContext).ValueReaderFactory
                  .Create(dataReader);

            if (readerOffset > 0)
            {
                valueReader = new OffsetValueReaderDecorator(valueReader, readerOffset);
            }

            var entityKey
                = entityKeyFactory.Create(entityType, keyProperties, valueReader);

            return(new QuerySourceScope <TEntity>(
                       querySource,
                       (TEntity)queryContext.QueryBuffer
                       .GetEntity(
                           entityType,
                           entityKey,
                           new EntityLoadInfo(
                               valueReader,
                               materializer),
                           queryStateManager),
                       parentQuerySourceScope));
        }
        protected override Expression VisitMethodCallExpression(MethodCallExpression methodCallExpression)
        {
            var newObject = VisitExpression(methodCallExpression.Object);

            if (newObject != methodCallExpression.Object)
            {
                return(newObject);
            }

            var newArguments = VisitAndConvert(methodCallExpression.Arguments, "VisitMethodCallExpression");

            if ((methodCallExpression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateEntityMethodInfo) ||
                 ReferenceEquals(methodCallExpression.Method, RelationalQueryModelVisitor.CreateValueReaderMethodInfo)) &&
                ((ConstantExpression)methodCallExpression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (Expression.Call(
                         _getValueMethodInfo,
                         methodCallExpression.Arguments[0],
                         methodCallExpression.Arguments[2],
                         methodCallExpression.Arguments[3]));
            }

            if (methodCallExpression.Method.MethodIsClosedFormOf(
                    QuerySourceScope.GetResultMethodInfo) &&
                ((ConstantExpression)methodCallExpression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (QuerySourceScope.GetResult(
                         methodCallExpression.Object,
                         _outerQuerySource,
                         typeof(TResult)));
            }

            if (newArguments != methodCallExpression.Arguments)
            {
                if (methodCallExpression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod))
                {
                    return(Expression.Call(
                               _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod
                               .MakeGenericMethod(typeof(QuerySourceScope <TResult>)),
                               newArguments));
                }

                if (methodCallExpression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.LinqOperatorProvider.Select))
                {
                    return
                        (ResultOperatorHandler.CallWithPossibleCancellationToken(
                             _relationalQueryCompilationContext.LinqOperatorProvider._First
                             .MakeGenericMethod(typeof(TResult)),
                             Expression.Call(
                                 _relationalQueryCompilationContext.LinqOperatorProvider.Select
                                 .MakeGenericMethod(
                                     typeof(QuerySourceScope),
                                     typeof(TResult)),
                                 newArguments)));
                }

                return(Expression.Call(methodCallExpression.Method, newArguments));
            }

            return(methodCallExpression);
        }