コード例 #1
0
        public virtual object GetEntity(
            IEntityType entityType,
            EntityKey entityKey,
            EntityLoadInfo entityLoadInfo,
            bool queryStateManager)
        {
            // hot path
            Debug.Assert(entityType != null);
            Debug.Assert(entityKey != null);

            if (entityKey == EntityKey.InvalidEntityKey)
            {
                return(null);
            }

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(entityKey);

                if (entry != null)
                {
                    return(entry.Entity);
                }
            }

            BufferedEntity bufferedEntity;

            if (!_byEntityKey.TryGetValue(entityKey, out bufferedEntity))
            {
                bufferedEntity
                    = new BufferedEntity(entityType, entityLoadInfo.ValueReader)
                    {
                    // TODO: Optimize this by not materializing when not required for query execution. i.e.
                    //       entity is only needed in final results
                    Instance = entityLoadInfo.Materialize()
                    };

                _byEntityKey.Add(entityKey, bufferedEntity);
                _byEntityInstance.Add(bufferedEntity.Instance, new List <BufferedEntity> {
                    bufferedEntity
                });
            }

            return(bufferedEntity.Instance);
        }
コード例 #2
0
        public virtual object GetEntity(IEntityType entityType, IValueReader valueReader, bool queryStateManager)
        {
            Check.NotNull(entityType, "entityType");
            Check.NotNull(valueReader, "valueReader");

            var keyProperties
                = entityType.GetPrimaryKey().Properties;

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

            if (entityKey == EntityKey.NullEntityKey)
            {
                return(null);
            }

            var stateEntry = _stateManager.TryGetEntry(entityKey);

            if (queryStateManager && stateEntry != null)
            {
                return(stateEntry.Entity);
            }

            BufferedEntity bufferedEntity;

            if (!_byEntityKey.TryGetValue(entityKey, out bufferedEntity))
            {
                bufferedEntity
                    = new BufferedEntity(entityType, valueReader)
                    {
                    // TODO: Optimize this by not materializing when not required for query execution. i.e.
                    //       entity is only needed in final results
                    Instance = _materializerSource.GetMaterializer(entityType)(valueReader)
                    };

                _byEntityKey.Add(entityKey, bufferedEntity);
                _byEntityInstance.Add(bufferedEntity.Instance, new List <BufferedEntity> {
                    bufferedEntity
                });
            }

            return(bufferedEntity.Instance);
        }
コード例 #3
0
        public virtual object GetEntity(
            IEntityType entityType,
            EntityKey entityKey,
            EntityLoadInfo entityLoadInfo,
            bool queryStateManager)
        {
            // hot path
            Debug.Assert(entityType != null);
            Debug.Assert(entityKey != null);

            if (entityKey == EntityKey.InvalidEntityKey)
            {
                return null;
            }

            if (queryStateManager)
            {
                var entry = _stateManager.TryGetEntry(entityKey);

                if (entry != null)
                {
                    return entry.Entity;
                }
            }

            BufferedEntity bufferedEntity;
            if (!_byEntityKey.TryGetValue(entityKey, out bufferedEntity))
            {
                bufferedEntity
                    = new BufferedEntity(entityType, entityLoadInfo.ValueReader)
                        {
                            // TODO: Optimize this by not materializing when not required for query execution. i.e.
                            //       entity is only needed in final results
                            Instance = entityLoadInfo.Materialize()
                    };

                _byEntityKey.Add(entityKey, bufferedEntity);
                _byEntityInstance.Add(bufferedEntity.Instance, new List<BufferedEntity> { bufferedEntity });
            }

            return bufferedEntity.Instance;
        }