Exemple #1
0
        //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));
        }