public async Task <IDynamicCollection <T> > GetOrCreateAsync <T>( string listName, Func <IQueryable <T>, IQueryable <T> > query = null, Func <IEnumerable <T>, IEnumerable <T> > sorter = null ) where T : IEntity { var collectionKey = GetCollectionCacheKey(listName); var result = IMemoryCacheService.Get <IDynamicCollection <T> >(collectionKey); if (result != null) { return(result); } var IRepository = IContainerService.Get <IRepository <T> >(); var idsKey = GetIdsCacheKey(listName); var entityIds = await ICacheService.GetAsync <List <string> >(idsKey); if (entityIds == null) { var queryable = IRepository.GetQueryable(); if (query != null) { queryable = query(queryable); } var entities = await IDatabaseService.QueryAsync(queryable); await IEntityCacheService.Push(entities); entityIds = entities .Select(x => x?.Id) .ToList(); } else { await IRepository.GetManyByIdAsync(entityIds); } result = IDynamicCollectionFactory .Create(entityIds, sorter); IMemoryCacheService.Set(collectionKey, result); return(result); }
public async Task <IEnumerable <T> > GetManyByIdAsync(IEnumerable <string> ids) { var cached = await IEntityCacheService.GetManyByIdAsync <T>(ids); var cachedIds = cached.Select(x => x.Id); var uncachedIds = ids.Except(cachedIds); var uncached = await IDatabaseService.GetManyByIdAsync <T>(uncachedIds); await IEntityCacheService.Push(uncached); cached = await IEntityCacheService.GetManyByIdAsync <T>(ids); return(cached); }