Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }