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); } }