private IQueryable <Advert> ApplyKeywordsCriteria(IQueryable <Advert> query, AdvertPageRequest pageRequest) { var keywordsArray = pageRequest.SearchKeywords .Split('.', ',', ';', ' ') .Select(w => w.Trim()) .Where(w => !string.IsNullOrWhiteSpace(w)) .ToArray(); var result = query; if (pageRequest.SearchInDescription) { foreach (var keyword in keywordsArray) { result = result.Where(a => EF.Functions.Like(a.Title + a.Description, $"%{keyword}%")); } } else { foreach (var keyword in keywordsArray) { result = result.Where(a => EF.Functions.Like(a.Title, $"%{keyword}%")); } } return(result); }
public IActionResult Search(AdvertPageRequest request) { request.Role = User.GetRole(); request.UserId = User.GetId(); var result = _db.Adverts.Search(request).Convert(a => _mapper.Map <AdvertExtendedDTO>(a)); return(Ok(result)); }
public Page <AdvertExtended> Search(AdvertPageRequest request) { var result = _table.AsQueryable(); result = result.Where(a => a.User.RoleId != request.Role); if (request.JobCategoriesId != null && request.JobCategoriesId.Count > 0) { result = result.Where( a => a.JobProposals.Any(jp => request.JobCategoriesId.Contains(jp.JobCategoryId))); } if (!string.IsNullOrWhiteSpace(request.SearchKeywords)) { result = ApplyKeywordsCriteria(result, request); } if (request.AdvertSortingOption == AdvertSortingOption.DateAdded) { result = result.OrderBy(a => a.CreatedDate, request.SortOrder); } else if (request.AdvertSortingOption == AdvertSortingOption.AccountRating) { result = result.OrderBy(a => a.User.Rating, request.SortOrder); } else if (request.AdvertSortingOption == AdvertSortingOption.CompletedContracts) { result = result.OrderBy( a => a.User.Contracts.Where(c => c.Status == ContractStatus.Completed).Count(), request.SortOrder); } var total = result.Count(); var set = result .Include(a => a.User) .Skip(request.PageIndex * request.PageSize) .Take(request.PageSize) .Select(a => new AdvertExtended { BaseAdvert = a, IsFavorite = a.FavoriteUsers.Any(u => u.UserId == request.UserId) }) .ToList(); return(new Page <AdvertExtended>(set, request.PageIndex, request.PageSize, total)); }