private object GetTargetEntity(
            IEntityType targetEntityType,
            EntityKeyFactory entityKeyFactory,
            IReadOnlyList <IProperty> keyProperties,
            EntityLoadInfo entityLoadInfo,
            ICollection <BufferedEntity> bufferedEntities,
            bool querySourceRequiresTracking)
        {
            var entityKey
                = entityKeyFactory
                  .Create(targetEntityType, keyProperties, entityLoadInfo.ValueReader);

            var targetEntity
                = GetEntity(
                      targetEntityType,
                      entityKey,
                      entityLoadInfo,
                      querySourceRequiresTracking);

            if (targetEntity != null)
            {
                List <BufferedEntity> bufferedTargetEntities;
                bufferedEntities.Add(
                    _byEntityInstance.TryGetValue(targetEntity, out bufferedTargetEntities)
                        ? bufferedTargetEntities[0]
                        : new BufferedEntity(targetEntityType, entityLoadInfo.ValueReader)
                {
                    Instance = targetEntity
                });
            }

            return(targetEntity);
        }
Beispiel #2
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));
        }
Beispiel #3
0
        public virtual void StartTracking(
            [NotNull] IStateManager stateManager, [NotNull] object entity, ValueBuffer valueBuffer)
        {
            Check.NotNull(stateManager, nameof(stateManager));
            Check.NotNull(entity, nameof(entity));

            stateManager.StartTracking(
                _entityType,
                _entityKeyFactory.Create(_entityKeyProperties, valueBuffer),
                entity,
                valueBuffer);
        }
        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));
        }
        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));
        }
Beispiel #6
0
 public virtual EntityKey CreateEntityKey(ValueBuffer valueBuffer)
 => EntityKeyFactory.Create(EntityKeyProperties, valueBuffer);
Beispiel #7
0
 public virtual EntityKey CreateEntityKey(ValueBuffer valueBuffer)
 {
     return(EntityKeyFactory.Create(EntityType, EntityKeyProperties, valueBuffer));
 }