private async Task <IList <IBoardPostEntity> > LoadEntities(IList <PostStoreEntityId> ids, PostStoreLoadMode mode)
        {
            ValueTask <List <IBoardPostEntity> > DoLoad(IList <PostStoreEntityId> toLoad)
            {
                return(OpenSession(session =>
                {
                    var result = new List <IBoardPostEntity>();
                    var loadContext = CreateLoadContext(session, true, true);
                    var loadContextToDispose = loadContext;
                    using (loadContextToDispose)
                    {
                        foreach (var id in toLoad)
                        {
                            Api.MakeKey(loadContext.table.Session, loadContext.table, id.Id, MakeKeyGrbit.NewKey);
                            if (Api.TrySeek(loadContext.table.Session, loadContext.table, SeekGrbit.SeekEQ))
                            {
                                var r = LoadBoardEntity(session, ref loadContext, mode);
                                result.Add(r);
                            }
                        }
                    }
                    return result;
                }));
            }

            if (ids == null)
            {
                throw new ArgumentNullException(nameof(ids));
            }
            mode = mode ?? DefaultLoadMode;

            IList <IBoardPostEntity> loaded;

            if (ids.Count > 4)
            {
                var toLoad      = ids.DistributeToProcess(3);
                var tasks       = toLoad.Select(DoLoad).ToArray();
                var taskResults = await CoreTaskHelper.WhenAllValueTasks(tasks);

                loaded = taskResults.SelectMany(r => r).ToList();
            }
            else
            {
                loaded = await DoLoad(ids);
            }

            if (mode.EntityLoadMode == PostStoreEntityLoadMode.Full)
            {
                await FillChildrenInLoadResult(loaded);
            }

            return(loaded);
        }
        private IBoardPostEntity LoadThreadCollection(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode, PostStoreEntityType entityType)
        {
            switch (loadMode.EntityLoadMode)
            {
            case PostStoreEntityLoadMode.LinkOnly:
                return(LoadLinkOnly(loadContext.table));

            case PostStoreEntityLoadMode.EntityOnly:
                return(LoadBareEntity(loadContext.table, entityType));

            case PostStoreEntityLoadMode.Light:
            case PostStoreEntityLoadMode.Full:
                return(LoadThreadCollection(loadContext.table));

            default:
                return(null);
            }
        }
        private IBoardPostEntity LoadBoardEntity(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode)
        {
            var entityType = (PostStoreEntityType)loadContext.table.Columns.EntityType;
            var dl         = loadContext.table.Columns.DataLoaded;

            if (loadMode.EntityLoadMode != PostStoreEntityLoadMode.EntityOnly &&
                loadMode.EntityLoadMode != PostStoreEntityLoadMode.LinkOnly && dl == false)
            {
                var loadMode1 = loadMode.Clone();
                loadMode1.EntityLoadMode = PostStoreEntityLoadMode.EntityOnly;
                loadMode = loadMode1;
            }
            switch (entityType)
            {
            case PostStoreEntityType.Post:
            case PostStoreEntityType.ThreadPreviewPost:
            case PostStoreEntityType.CatalogPost:
                return(LoadPost(session, ref loadContext, loadMode, entityType));

            case PostStoreEntityType.Thread:
            case PostStoreEntityType.Catalog:
                return(LoadPostCollection(session, ref loadContext, loadMode, entityType));

            case PostStoreEntityType.ThreadPreview:
                return(LoadThreadPreview(session, ref loadContext, loadMode, entityType));

            case PostStoreEntityType.BoardPage:
                return(LoadThreadCollection(session, ref loadContext, loadMode, entityType));

            default:
                return(null);
            }
        }
        private IBoardPostEntity LoadPost(IEsentSession session, ref LoadPostDataContext loadContext, PostStoreLoadMode loadMode, PostStoreEntityType entityType)
        {
            switch (loadMode.EntityLoadMode)
            {
            case PostStoreEntityLoadMode.LinkOnly:
                return(LoadLinkOnly(loadContext.table));

            case PostStoreEntityLoadMode.EntityOnly:
                return(LoadBareEntity(loadContext.table, entityType));

            case PostStoreEntityLoadMode.Light:
                return(LoadPostLight(session, loadContext.table, loadMode.RetrieveCounterNumber, entityType));

            case PostStoreEntityLoadMode.Full:
                return(LoadPost(session, ref loadContext, loadMode.RetrieveCounterNumber, entityType));

            default:
                return(null);
            }
        }