public void SetCollectionMaterializationContext(
                int collectionId, CollectionMaterializationContext collectionMaterializationContext)
            {
                while (Collections.Count <= collectionId)
                {
                    Collections.Add(null);
                }

                Collections[collectionId] = collectionMaterializationContext;
            }
            private static void InitializeCollectionInclude <TEntity, TIncludingEntity>(
                int collectionId,
                QueryContext queryContext,
                DbDataReader dbDataReader,
                ResultCoordinator resultCoordinator,
                TEntity entity,
                Func <QueryContext, DbDataReader, object[]> outerIdentifier,
                INavigation navigation,
                IClrCollectionAccessor clrCollectionAccessor,
                bool trackingQuery)
                where TIncludingEntity : TEntity
            {
                object collection = null;

                if (entity is TIncludingEntity)
                {
                    // Include case
                    if (trackingQuery)
                    {
                        queryContext.StateManager.TryGetEntry(entity).SetIsLoaded(navigation);
                    }
                    else
                    {
                        SetIsLoadedNoTracking(entity, navigation);
                    }

                    collection = clrCollectionAccessor.GetOrCreate(entity);
                }

                var outerKey = outerIdentifier(queryContext, dbDataReader);

                var collectionMaterializationContext = new CollectionMaterializationContext(entity, collection, outerKey);

                if (resultCoordinator.Collections.Count == collectionId)
                {
                    resultCoordinator.Collections.Add(collectionMaterializationContext);
                }
                else
                {
                    resultCoordinator.Collections[collectionId] = collectionMaterializationContext;
                }
            }
            private static TCollection InitializeCollection <TElement, TCollection>(
                int collectionId,
                QueryContext queryContext,
                DbDataReader dbDataReader,
                ResultCoordinator resultCoordinator,
                Func <QueryContext, DbDataReader, object[]> parentIdentifier,
                Func <QueryContext, DbDataReader, object[]> outerIdentifier,
                IClrCollectionAccessor clrCollectionAccessor)
                where TCollection : class, IEnumerable <TElement>
            {
                var collection = clrCollectionAccessor?.Create() ?? new List <TElement>();

                var parentKey = parentIdentifier(queryContext, dbDataReader);
                var outerKey  = outerIdentifier(queryContext, dbDataReader);

                var collectionMaterializationContext = new CollectionMaterializationContext(null, collection, parentKey, outerKey);

                resultCoordinator.SetCollectionMaterializationContext(collectionId, collectionMaterializationContext);

                return((TCollection)collection);
            }
            private static void InitializeIncludeCollection <TParent, TNavigationEntity>(
                int collectionId,
                QueryContext queryContext,
                DbDataReader dbDataReader,
                ResultCoordinator resultCoordinator,
                TParent entity,
                Func <QueryContext, DbDataReader, object[]> parentIdentifier,
                Func <QueryContext, DbDataReader, object[]> outerIdentifier,
                INavigation navigation,
                IClrCollectionAccessor clrCollectionAccessor,
                bool trackingQuery)
                where TNavigationEntity : TParent
            {
                object collection = null;

                if (entity is TNavigationEntity)
                {
                    if (trackingQuery)
                    {
                        queryContext.SetNavigationIsLoaded(entity, navigation);
                    }
                    else
                    {
                        SetIsLoadedNoTracking(entity, navigation);
                    }

                    collection = clrCollectionAccessor.GetOrCreate(entity, forMaterialization: true);
                }

                var parentKey = parentIdentifier(queryContext, dbDataReader);
                var outerKey  = outerIdentifier(queryContext, dbDataReader);

                var collectionMaterializationContext = new CollectionMaterializationContext(entity, collection, parentKey, outerKey);

                resultCoordinator.SetCollectionMaterializationContext(collectionId, collectionMaterializationContext);
            }