public virtual async Task <PricelistSearchResult> SearchPricelistsAsync(PricelistSearchCriteria criteria) { var cacheKey = CacheKey.With(GetType(), nameof(SearchPricelistsAsync), criteria.GetCacheKey()); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry => { cacheEntry.AddExpirationToken(PricingSearchCacheRegion.CreateChangeToken()); var result = AbstractTypeFactory <PricelistSearchResult> .TryCreateInstance(); using (var repository = _repositoryFactory()) { var query = BuildQuery(repository, criteria); var sortInfos = BuildSortExpression(criteria); result.TotalCount = await query.CountAsync(); if (criteria.Take > 0) { var pricelistIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id) .Select(x => x.Id) .Skip(criteria.Skip).Take(criteria.Take) .AsNoTracking() .ToArrayAsync(); var unorderedResults = await _pricingService.GetPricelistsByIdAsync(pricelistIds); result.Results = unorderedResults.OrderBy(x => Array.IndexOf(pricelistIds, x.Id)).ToList(); } } return result; })); }
public virtual async Task <PricelistSearchResult> SearchPricelistsAsync(PricelistSearchCriteria criteria) { var cacheKey = CacheKey.With(GetType(), nameof(SearchPricelistsAsync), criteria.GetCacheKey()); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry => { cacheEntry.AddExpirationToken(PricingSearchCacheRegion.CreateChangeToken()); var retVal = AbstractTypeFactory <PricelistSearchResult> .TryCreateInstance(); using (var repository = _repositoryFactory()) { var query = repository.Pricelists; if (!string.IsNullOrEmpty(criteria.Keyword)) { query = query.Where(x => x.Name.Contains(criteria.Keyword) || x.Description.Contains(criteria.Keyword)); } var sortInfos = criteria.SortInfos; if (sortInfos.IsNullOrEmpty()) { sortInfos = new[] { new SortInfo { SortColumn = ReflectionUtility.GetPropertyName <Pricelist>(x => x.Name) } }; } query = query.OrderBySortInfos(sortInfos); retVal.TotalCount = await query.CountAsync(); if (criteria.Take > 0) { query = query.Skip(criteria.Skip).Take(criteria.Take); var pricelistsIds = await query.Select(x => x.Id).ToListAsync(); retVal.Results = (await _pricingService.GetPricelistsByIdAsync(pricelistsIds.ToArray())) .OrderBy(x => pricelistsIds.IndexOf(x.Id)).ToList(); } } return retVal; })); }