public async Task <IActionResult> Search(string?query, [FromQuery] AutoFilterRequest filter, [Range(1, int.MaxValue)] int page = 1, [Range(1, 24)] int pageSize = 5) { IEnumerable <int>?searchResultIds = null; if (!string.IsNullOrEmpty(query)) { ISearchResponse <AutoPostSearchDTO> searchResponse = await _elasticClient.SearchAsync <AutoPostSearchDTO>( s => s.Query(q => q.QueryString(d => d.Query(query))) .From((page - 1) * pageSize) .Size(pageSize)); searchResultIds = searchResponse.Documents.Select(x => x.PostId); } IEnumerable <int> filterIds = _autoService.Filter(filter).Select(x => x.PostId); if (searchResultIds != null) { filterIds = searchResultIds.Join(filterIds, x => x, x => x, (postId, _) => postId); } int totalResults = filterIds.Count(); filterIds = filterIds.Skip((page - 1) * pageSize).Take(pageSize); return(Ok(new PaginatedResponse <AutoPost>(await _postService.Get <AutoPost>(filterIds), page, totalResults))); }
public IQueryable <AutoPost> Filter(AutoFilterRequest autoFilterRequest) { IQueryable <AutoPost> filteredPosts = _myDbContext.AutoPosts.AsNoTracking().Where(x => x.IsPublic == true); if (!string.IsNullOrEmpty(autoFilterRequest.Vin)) { filteredPosts = filteredPosts.Where(x => !string.IsNullOrEmpty(x.Vin) && x.Vin.Contains(autoFilterRequest.Vin.ToUpper())); } if (!string.IsNullOrEmpty(autoFilterRequest.Series)) { filteredPosts = filteredPosts.Where(x => !string.IsNullOrEmpty(x.Series) && x.Series.Contains(autoFilterRequest.Series.ToUpper())); } if (!string.IsNullOrEmpty(autoFilterRequest.Trim)) { filteredPosts = filteredPosts.Where(x => !string.IsNullOrEmpty(x.Trim) && x.Trim.Contains(autoFilterRequest.Trim.ToUpper())); } if (!string.IsNullOrEmpty(autoFilterRequest.Color)) { filteredPosts = filteredPosts.Where(x => !string.IsNullOrEmpty(x.Color) && x.Color.Contains(autoFilterRequest.Color.ToUpper())); } if (autoFilterRequest.MileageFrom.HasValue) { filteredPosts = filteredPosts.Where(x => x.Mileage.HasValue && x.Mileage >= autoFilterRequest.MileageFrom); } if (autoFilterRequest.MileageTo.HasValue) { filteredPosts = filteredPosts.Where(x => x.Mileage.HasValue && x.Mileage <= autoFilterRequest.MileageTo); } if (autoFilterRequest.YearFrom.HasValue) { filteredPosts = filteredPosts.Where(x => x.Year.HasValue && x.Year >= autoFilterRequest.YearFrom); } if (autoFilterRequest.YearTo.HasValue) { filteredPosts = filteredPosts.Where(x => x.Year.HasValue && x.Year <= autoFilterRequest.YearTo); } if (autoFilterRequest.Makes != null && autoFilterRequest.Makes.Any()) { filteredPosts = filteredPosts.Where(x => x.MakeId.HasValue && autoFilterRequest.Makes.Contains(x.MakeId.Value)); } if (autoFilterRequest.Models != null && autoFilterRequest.Models.Any()) { filteredPosts = filteredPosts.Where(x => x.ModelId.HasValue && autoFilterRequest.Models.Contains(x.ModelId.Value)); } if (autoFilterRequest.CylinderCount != null && autoFilterRequest.CylinderCount.Any()) { filteredPosts = filteredPosts.Where(x => x.Cylinders.HasValue && autoFilterRequest.CylinderCount.Contains(x.Cylinders.Value)); } if (autoFilterRequest.AutoTypes != null && autoFilterRequest.AutoTypes.Any()) { filteredPosts = filteredPosts.Where(x => x.AutoType.HasValue && autoFilterRequest.AutoTypes.Contains(x.AutoType.Value)); } if (autoFilterRequest.TransmissionTypes != null && autoFilterRequest.TransmissionTypes.Any()) { filteredPosts = filteredPosts.Where(x => x.TransmissionType.HasValue && autoFilterRequest.TransmissionTypes.Contains(x.TransmissionType.Value)); } if (autoFilterRequest.TitleStatuses != null && autoFilterRequest.TitleStatuses.Any()) { filteredPosts = filteredPosts.Where(x => x.TitleStatus.HasValue && autoFilterRequest.TitleStatuses.Contains(x.TitleStatus.Value)); } if (autoFilterRequest.FuelTypes != null && autoFilterRequest.FuelTypes.Any()) { filteredPosts = filteredPosts.Where(x => x.FuelType.HasValue && autoFilterRequest.FuelTypes.Contains(x.FuelType.Value)); } if (autoFilterRequest.AutoConditions != null && autoFilterRequest.AutoConditions.Any()) { filteredPosts = filteredPosts.Where(x => x.AutoCondition.HasValue && autoFilterRequest.AutoConditions.Contains(x.AutoCondition.Value)); } if (autoFilterRequest.ModifiedDateFrom.HasValue) { filteredPosts = filteredPosts.Where(x => x.ModifiedDate.HasValue && x.ModifiedDate >= autoFilterRequest.ModifiedDateFrom); } if (autoFilterRequest.ModifiedDateTo.HasValue) { filteredPosts = filteredPosts.Where(x => x.ModifiedDate.HasValue && x.ModifiedDate <= autoFilterRequest.ModifiedDateTo); } if (autoFilterRequest.CreatedDateFrom.HasValue) { filteredPosts = filteredPosts.Where(x => x.CreatedDate.HasValue && x.CreatedDate >= autoFilterRequest.CreatedDateFrom); } if (autoFilterRequest.CreatedDateTo.HasValue) { filteredPosts = filteredPosts.Where(x => x.CreatedDate.HasValue && x.CreatedDate <= autoFilterRequest.CreatedDateTo); } if (autoFilterRequest.HasImages != null) { filteredPosts = filteredPosts.Where(x => x.PostImages.Any() == autoFilterRequest.HasImages); } return(filteredPosts); }