//fuzzy query by parameters public async Task <PagedListForTask <EmployeeTask> > GetTasksAsync(TaskDtoParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } var queryExpression = _context.EmployeeTasks as IQueryable <EmployeeTask>; //判断datetime类型为空就看它和最小值相等与否,最小值是0001-01-01 //if (string.IsNullOrWhiteSpace(parameters.SearchTerm) && parameters.Deadline == DateTime.MinValue) // return await PagedListForTask<EmployeeTask>.CreateAsnyc(queryExpression, parameters.PageNumber, parameters.PageSize); //这里不能转成IEnumerable因为后面不能转成异步list,而IQueryable相当于生成不马上执行的sql查询语句,可以转成异步list //var queryExpression = _context.EmployeeTasks as IEnumerable<EmployeeTask>; if (parameters.Deadline != DateTime.MinValue) { parameters.Deadline = DateTime.Parse(parameters.Deadline.ToString().Trim()); queryExpression = queryExpression.Where(x => x.Deadline == parameters.Deadline); } if (!string.IsNullOrWhiteSpace(parameters.SearchTerm)) { parameters.SearchTerm = parameters.SearchTerm.Trim(); queryExpression = queryExpression.Where(x => x.TaskName.Contains(parameters.SearchTerm) || x.TaskDescription.Contains(parameters.SearchTerm)); } //根据排序字符串获取对应的排序属性 var mappingDictionary = _propertyMappingServiceForTask.GetPropertyMapping <EmployeeTaskDto, EmployeeTask>(); queryExpression = queryExpression.ApplySortForTask(parameters.OrderBy, mappingDictionary); return(await PagedListForTask <EmployeeTask> .CreateAsnyc(queryExpression, parameters.PageNumber, parameters.PageSize)); }
//这里用拼接uri,返回的header里能看到翻页前后的uri地址,属于GetTasksBySearch的响应 private string CreateTasksResponseUri(TaskDtoParameters parameters, ResourceUriType type) { //PreviousPage and NextPage switch (type) { //前一页 case ResourceUriType.PreviousPage: return(Url.Link(nameof(GetTasksBySearch), new { pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, searchTerm = parameters.SearchTerm, deadline = parameters.Deadline, orderBy = parameters.OrderBy })); //Url.Link拼接翻页的uri, 这里一定要带上所有的查询过滤条件(TaskDtoParameters里的),否则生成的uri翻页后的数据就不对了 case ResourceUriType.NextPage: return(Url.Link(nameof(GetTasksBySearch), new { pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, searchTerm = parameters.SearchTerm, deadline = parameters.Deadline, orderBy = parameters.OrderBy })); //Url.Link拼接翻页的uri default: return(Url.Link(nameof(GetTasksBySearch), new { pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, searchTerm = parameters.SearchTerm, deadline = parameters.Deadline, orderBy = parameters.OrderBy })); //Url.Link拼接翻页的uri } }
public async Task <ActionResult <IEnumerable <EmployeeTaskDto> > > GetTasksBySearch([FromQuery] TaskDtoParameters parameters) { if (!_propertyMappingServiceForTask.ExistsMapping <EmployeeTaskDto, EmployeeTask>(parameters.OrderBy)) { return(BadRequest()); } if (parameters == null) { return(BadRequest()); } var employeeTasks = await _employeeTaskRepository.GetTasksAsync(parameters); //有前一页就创造前一页的uri,没有就为空 //因为CreateTasksResponseUri用了Url.Link把datetime加密了,所以这里要解密一下,但是一般情况下,uri的datetime是不直接显示的,这里为了显示前后页的正确uri var previousLink = employeeTasks.HasPrevious ? HttpUtility.UrlDecode(CreateTasksResponseUri(parameters, ResourceUriType.PreviousPage)) : null; var nextLink = employeeTasks.HasNext ? HttpUtility.UrlDecode(CreateTasksResponseUri(parameters, ResourceUriType.NextPage)) : null; //创建一个页码匿名类,没有类名,只是为了使用里面的属性 var paginationMetadata = new { totalCount = employeeTasks.TotalCount, pageSize = employeeTasks.PageSize, currentPage = employeeTasks.CurrentPage, totalPage = employeeTasks.TotalPages, previousLink, nextLink }; //把匿名类的属性添加到header里,命名为X-Pagination Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { //不安全的字符会被转义,这里改一下不让转义 Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var taskDto = _mapper.Map <IEnumerable <EmployeeTaskDto> >(employeeTasks); return(Ok(taskDto)); }