public async Task <SubscriptionSearchResult> SearchAsync(SubscriptionSearchCriteria searchCriteria) { var cacheKey = CacheKey.With(GetType(), nameof(SearchAsync), searchCriteria.GetCacheKey()); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken()); var result = new SubscriptionSearchResult(); using (var repository = _subscriptionRepositoryFactory()) { repository.DisableChangesTracking(); var sortInfos = BuildSortExpression(searchCriteria); var query = BuildQuery(searchCriteria, repository); result.TotalCount = await query.CountAsync(); if (searchCriteria.Take > 0 && result.TotalCount > 0) { var subscriptionIds = query.OrderBySortInfos(sortInfos) .ThenBy(x => x.Id) .Select(x => x.Id) .Skip(searchCriteria.Skip) .Take(searchCriteria.Take) .ToArray(); result.Results = (await _subscriptionService.GetByIdsAsync(subscriptionIds, searchCriteria.ResponseGroup)).OrderBy(x => Array.IndexOf(subscriptionIds, x.Id)).ToArray(); } } return result; })); }
public virtual async Task <SubscriptionSearchResult> SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria) { var cacheKey = CacheKey.With(GetType(), nameof(SearchSubscriptionsAsync), criteria.GetCacheKey()); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry => { cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken()); var retVal = AbstractTypeFactory <SubscriptionSearchResult> .TryCreateInstance(); using (var repository = _subscriptionRepositoryFactory()) { repository.DisableChangesTracking(); var query = BuildQuery(repository, criteria); var sortInfos = BuildSortExpression(criteria); retVal.TotalCount = await query.CountAsync(); if (criteria.Take > 0) { var subscriptionsIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id) .Select(x => x.Id) .Skip(criteria.Skip).Take(criteria.Take) .ToArrayAsync(); //Load subscriptions with preserving sorting order var unorderedResults = await _subscriptionService.GetByIdsAsync(subscriptionsIds, criteria.ResponseGroup); retVal.Results = unorderedResults.OrderBy(x => Array.IndexOf(subscriptionsIds, x.Id)).ToArray(); } return retVal; } })); }
public virtual async Task <GenericSearchResult <Subscription> > SearchSubscriptionsAsync(SubscriptionSearchCriteria criteria) { var cacheKey = CacheKey.With(GetType(), nameof(SearchSubscriptionsAsync), criteria.GetCacheKey()); return(await PlatformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry => { cacheEntry.AddExpirationToken(SubscriptionSearchCacheRegion.CreateChangeToken()); var retVal = new GenericSearchResult <Subscription>(); using (var repository = SubscriptionRepositoryFactory()) { repository.DisableChangesTracking(); var query = await GetSubscriptionsQueryForCriteria(repository, criteria); retVal.TotalCount = await query.CountAsync(); if (criteria.Take > 0) { var subscriptionEntities = await query.Skip(criteria.Skip).Take(criteria.Take).ToArrayAsync(); var subscriptionsIds = subscriptionEntities.Select(x => x.Id).ToArray(); //Load subscriptions with preserving sorting order var unorderedResults = await GetByIdsAsync(subscriptionsIds, criteria.ResponseGroup); retVal.Results = unorderedResults.OrderBy(x => Array.IndexOf(subscriptionsIds, x.Id)).ToArray(); } return retVal; } })); }