public PostSearchResult Search(PostSearchOptions postSearchOptions) { IQueryable <Post> query; if (postSearchOptions.Data == null) { query = Repository .Get(); } else { string dataToLower = postSearchOptions.Data.ToLower(); query = Repository .Get(e => e.Title.ToLower().Contains(dataToLower) || e.Description.ToLower().Contains(dataToLower) || e.Article.Content.ToLower().Contains(dataToLower)); } if (postSearchOptions.SearchType == SearchType.Recommended) { var recommendedPostsIds = _recommenderService.GetRecommendedPostsIds(query, postSearchOptions.UserId); query = query.Where(p => recommendedPostsIds.Contains(p.Id)); } int count = query.Count(); List <PostDto> posts = query .Skip(postSearchOptions.PageIndex * postSearchOptions.PageSize) .Take(postSearchOptions.PageSize) .Select(e => new PostDto { Id = e.Id, Title = e.Title, Description = e.Description, PostedOn = e.PostedOn, GlobalRateValue = e.Rates.Any() ? e.Rates.Average(r => r.Value) : 0, UserRate = e.Rates .Where(r => r.UserId == postSearchOptions.UserId) .Select(r => new RateDto { Id = r.Id, Value = r.Value, PostId = r.PostId, UserId = r.UserId }) .SingleOrDefault() }) .ToList(); PostSearchResult model = new PostSearchResult { Posts = posts, Count = count }; return(model); }
public IActionResult Search([FromQuery] PostSearchOptions postSearch) { return(Ok(((IPostService)_service).Search(postSearch))); }