コード例 #1
0
        private static QueryResultScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QueryResultScope parentQueryResultScope,
            ValueBuffer valueBuffer,
            int valueBufferOffset,
            IEntityType entityType,
            bool queryStateManager,
            EntityKeyFactory entityKeyFactory,
            IReadOnlyList <IProperty> keyProperties,
            Func <ValueBuffer, object> materializer)
            where TEntity : class
        {
            valueBuffer = valueBuffer.WithOffset(valueBufferOffset);

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

            return(new QueryResultScope <TEntity>(
                       querySource,
                       entityKey != EntityKey.InvalidEntityKey
                    ? (TEntity)queryContext.QueryBuffer
                       .GetEntity(
                           entityType,
                           entityKey,
                           new EntityLoadInfo(
                               valueBuffer,
                               materializer),
                           queryStateManager)
                    : null,
                       parentQueryResultScope));
        }
コード例 #2
0
 private static QueryResultScope <ValueBuffer> CreateValueBuffer(
     IQuerySource querySource,
     QueryContext queryContext,
     QueryResultScope parentQueryResultScope,
     ValueBuffer valueBuffer,
     int valueBufferOffset)
 => new QueryResultScope <ValueBuffer>(
     querySource,
     valueBuffer.WithOffset(valueBufferOffset),
     parentQueryResultScope);
        private static QueryResultScope <TEntity> CreateEntity <TEntity>(
            IQuerySource querySource,
            QueryContext queryContext,
            QueryResultScope parentQueryResultScope,
            ValueBuffer valueBuffer,
            int valueBufferOffset,
            IEntityType entityType,
            bool queryStateManager,
            EntityKeyFactory entityKeyFactory,
            IReadOnlyList <IProperty> keyProperties,
            Func <ValueBuffer, object> materializer,
            bool allowNullResult)
            where TEntity : class
        {
            valueBuffer = valueBuffer.WithOffset(valueBufferOffset);

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

            TEntity entity = null;

            if (entityKey == EntityKey.InvalidEntityKey)
            {
                if (!allowNullResult)
                {
                    throw new InvalidOperationException(RelationalStrings.InvalidKeyValue(entityType.DisplayName()));
                }
            }
            else
            {
                entity
                    = (TEntity)queryContext.QueryBuffer
                      .GetEntity(
                          entityType,
                          entityKey,
                          new EntityLoadInfo(valueBuffer, materializer),
                          queryStateManager);
            }

            return(new QueryResultScope <TEntity>(querySource, entity, parentQueryResultScope));
        }
コード例 #4
0
        public override Expression Visit(Expression expression)
        {
            var selectExpression = QueryModelVisitor.TryGetQuery(_querySource);

            if (expression != null &&
                !(expression is ConstantExpression) &&
                selectExpression != null)
            {
                var sqlExpression
                    = new SqlTranslatingExpressionVisitor(
                          _queryModelVisitor, selectExpression, inProjection: true)
                      .Visit(expression);

                if (sqlExpression == null)
                {
                    if (!(expression is QuerySourceReferenceExpression))
                    {
                        _requiresClientEval = true;
                    }
                }
                else
                {
                    if (!(expression is NewExpression))
                    {
                        AliasExpression aliasExpression;

                        int index;

                        if (!(expression is QuerySourceReferenceExpression))
                        {
                            var columnExpression = sqlExpression.TryGetColumnExpression();

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

                                aliasExpression = selectExpression.Projection[index] as AliasExpression;

                                if (aliasExpression != null)
                                {
                                    aliasExpression.SourceExpression = expression;
                                }

                                return(expression);
                            }
                        }

                        if (!(sqlExpression is ConstantExpression))
                        {
                            index = selectExpression.AddToProjection(sqlExpression);

                            aliasExpression = selectExpression.Projection[index] as AliasExpression;

                            if (aliasExpression != null)
                            {
                                aliasExpression.SourceExpression = expression;
                            }

                            return
                                (QueryModelVisitor.BindReadValueMethod(
                                     expression.Type,
                                     QueryResultScope.GetResult(
                                         EntityQueryModelVisitor.QueryResultScopeParameter,
                                         _querySource,
                                         typeof(ValueBuffer)),
                                     index));
                        }
                    }
                }
            }

            return(base.Visit(expression));
        }
コード例 #5
0
        public override Expression Visit(Expression expression)
        {
            var selectExpression = QueryModelVisitor.TryGetQuery(_querySource);

            if (expression != null &&
                !(expression is ConstantExpression) &&
                selectExpression != null)
            {
                var sqlExpression
                    = _sqlTranslatingExpressionVisitorFactory
                      .Create(QueryModelVisitor, selectExpression, inProjection: true)
                      .Visit(expression);

                if (sqlExpression == null)
                {
                    if (!(expression is QuerySourceReferenceExpression))
                    {
                        QueryModelVisitor.RequiresClientProjection = true;
                    }
                }
                else
                {
                    if (!(expression is NewExpression))
                    {
                        AliasExpression aliasExpression;

                        int index;

                        if (!(expression is QuerySourceReferenceExpression))
                        {
                            var columnExpression = sqlExpression.TryGetColumnExpression();

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

                                aliasExpression = selectExpression.Projection[index] as AliasExpression;

                                if (aliasExpression != null)
                                {
                                    aliasExpression.SourceExpression = expression;
                                }

                                return(expression);
                            }
                        }

                        if (!(sqlExpression is ConstantExpression))
                        {
                            index = selectExpression.AddToProjection(sqlExpression);

                            aliasExpression = selectExpression.Projection[index] as AliasExpression;

                            if (aliasExpression != null)
                            {
                                aliasExpression.SourceExpression = expression;
                            }

                            var valueBufferExpression
                                = QueryResultScope.GetResult(
                                      EntityQueryModelVisitor.QueryResultScopeParameter,
                                      _querySource,
                                      typeof(ValueBuffer));

                            var readValueExpression
                                = _entityMaterializerSource
                                  .CreateReadValueCallExpression(valueBufferExpression, index);

                            var outputDataInfo
                                = (expression as SubQueryExpression)?.QueryModel
                                  .GetOutputDataInfo();

                            if (outputDataInfo is StreamedScalarValueInfo)
                            {
                                // Compensate for possible nulls
                                readValueExpression
                                    = Expression.Coalesce(
                                          readValueExpression,
                                          Expression.Default(expression.Type));
                            }

                            return(Expression.Convert(readValueExpression, expression.Type));
                        }
                    }
                }
            }

            return(base.Visit(expression));
        }