public IActionResult Get([FromQuery] MessageSearchDto search) { try { var result = new MessageResultsDto(); // Default to first page if (search.Page < 1) { search.Page = 1; } // Default to 20 records per page if (search.Size < 1) { search.Size = 20; } result = _repo.SearchMessages(search, m => // By Category Id (search.Cat == null || m.CategoryId == search.Cat) // By Sender Name like && (string.IsNullOrEmpty(search.Sender) || m.Name.Contains(search.Sender)) // By Sender Email && (string.IsNullOrEmpty(search.Email) || m.Email == search.Email) // By Subject && (string.IsNullOrEmpty(search.Subject) || m.Subject.Contains(search.Subject)) // Only read or unread messages && (search.Read == null || (search.Read == true && m.DateRead != null) || (search.Read == false && m.DateRead == null)) // Messages sent from certain date && (search.From == null || m.DateSent.Date >= search.From.Value.Date) // Messages sent upto certain date && (search.To == null || m.DateSent.Date <= search.To.Value.Date) ); // TODO: Fix AutoMapper Error: Unmapped properties: Category // var dtos = _mapper.Map<IEnumerable<Message>, IEnumerable<MessageDto>>(entities); return(Ok(result)); } catch (Exception ex) { _logger.LogError($"Failed to get messages: {ex}"); return(BadRequest("Failed to get messages")); } }
public MessageResultsDto SearchMessages(MessageSearchDto s, Expression <Func <Message, bool> > predicate) { // if search criteria provided then search by it, otherwise get all records without criteria var query = predicate == null ? _ctx.Messages : _ctx.Messages.Where(predicate); // if sort field provided then implement OrderBy if (!string.IsNullOrEmpty(s.SortBy)) { query = query .OrderBy(s.SortBy, s.Desc) .ThenBy("Id"); } // total number of records for the given search var total = query.Count(); // Number of records to skip for this paging result var skip = (s.Page - 1) * s.Size; // Only select records on the current page using Take and Skip var records = query .Skip(skip) .Take(s.Size) .ToList(); // Return paging result dto return(new MessageResultsDto() { Page = s.Page, Size = s.Size, Total = total, Records = records }); }