public QuoteRequestSearchResult Search(QuoteRequestSearchCriteria criteria)
        {
            QuoteRequestSearchResult retVal = null;

            using (var repository = _repositoryFactory())
            {
                var query = repository.QuoteRequests;
                if (criteria.CustomerId != null)
                {
                    query = query.Where(x => x.CustomerId == criteria.CustomerId);
                }
                if (criteria.StoreId != null)
                {
                    query = query.Where(x => x.StoreId == criteria.StoreId);
                }

                if (criteria.Number != null)
                {
                    query = query.Where(x => x.Number == criteria.Number);
                }
                else if (criteria.Keyword != null)
                {
                    query = query.Where(x => x.Number.Contains(criteria.Keyword));
                }

                if (criteria.Tag != null)
                {
                    query = query.Where(x => x.Tag == criteria.Tag);
                }
                if (criteria.Status != null)
                {
                    query = query.Where(x => x.Status == criteria.Status);
                }
                var ids = query.OrderByDescending(x => x.CreatedDate)
                          .Skip(criteria.Start)
                          .Take(criteria.Count)
                          .Select(x => x.Id)
                          .ToArray();

                retVal = new QuoteRequestSearchResult
                {
                    TotalCount    = query.Count(),
                    QuoteRequests = GetByIds(ids).ToList()
                };
            }
            return(retVal);
        }
        public async Task <QuoteRequestSearchResult> SearchAsync(QuoteRequestSearchCriteria criteria)
        {
            var result   = new QuoteRequestSearchResult();
            var cacheKey = CacheKey.With(GetType(), nameof(SearchAsync), criteria.GetCacheKey());

            return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async cacheEntry =>
            {
                cacheEntry.AddExpirationToken(QuoteSearchCacheRegion.CreateChangeToken());
                using (var repository = _repositoryFactory())
                {
                    var query = repository.QuoteRequests;
                    if (criteria.CustomerId != null)
                    {
                        query = query.Where(x => x.CustomerId == criteria.CustomerId);
                    }
                    if (criteria.StoreId != null)
                    {
                        query = query.Where(x => x.StoreId == criteria.StoreId);
                    }

                    if (criteria.Number != null)
                    {
                        query = query.Where(x => x.Number == criteria.Number);
                    }
                    else if (criteria.Keyword != null)
                    {
                        query = query.Where(x => x.Number.Contains(criteria.Keyword) ||
                                            (x.CustomerName != null && x.CustomerName.Contains(criteria.Keyword)) ||
                                            (x.Status != null && x.Status.Contains(criteria.Keyword)));
                    }

                    if (criteria.Tag != null)
                    {
                        query = query.Where(x => x.Tag == criteria.Tag);
                    }
                    if (criteria.Status != null)
                    {
                        query = query.Where(x => x.Status == criteria.Status);
                    }
                    var sortInfos = criteria.SortInfos;
                    if (sortInfos.IsNullOrEmpty())
                    {
                        sortInfos = new[] { new SortInfo {
                                                SortColumn = ReflectionUtility.GetPropertyName <QuoteRequest>(x => x.CreatedDate), SortDirection = SortDirection.Descending
                                            } };
                    }

                    result.TotalCount = await query.CountAsync();
                    if (criteria.Take > 0)
                    {
                        var ids = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id)
                                  .Select(x => x.Id)
                                  .Skip(criteria.Skip).Take(criteria.Take)
                                  .ToArrayAsync();

                        result.Results = (await GetByIdsAsync(ids)).OrderBy(x => Array.IndexOf(ids, x.Id)).ToList();
                    }
                }
                return result;
            }));
        }