public async Task <IEnumerable <Employee> > Get( decimal minSalary, decimal maxSalary, int offset, int limit, EmployeeSortOptions sort) { try { var query = _dbContext.Employees .AsNoTracking() .Where(e => (e.Salary <= maxSalary && e.Salary >= minSalary) || (minSalary == 0 && maxSalary == 0)); IOrderedQueryable <EmployeeDbModel> orderedQuery; orderedQuery = GetOrderedQuery(query, sort); var employees = await orderedQuery.Skip(offset).Take(limit) .Select(e => e as Employee) .ToListAsync(); return(employees); } catch (DbUpdateConcurrencyException ex) { throw new InvalidEmployeeDataException("One or more employee records are being updated by another operation.", ex); } }
public async Task <IActionResult> Get( [FromQuery] decimal minSalary, [FromQuery] decimal maxSalary, [FromQuery] int offset, [FromQuery] int limit, [FromQuery][ModelBinder(Name = "sort")] EmployeeSortOptions sort) { try { var users = await _employeeService.Get(minSalary, maxSalary, offset, limit, sort); return(new ObjectResult(users)); } catch (InvalidEmployeeDataException ex) { return(BadRequest(ex.Message)); } }
private IOrderedQueryable <EmployeeDbModel> GetOrderedQuery( IQueryable <EmployeeDbModel> query, EmployeeSortOptions sort) { if (sort.Order == Order.Asc) { switch (sort.Field) { case Field.Id: return(query.OrderBy(e => e.Id)); case Field.Login: return(query.OrderBy(e => e.Login)); case Field.Name: return(query.OrderBy(e => e.Name)); default: return(query.OrderBy(e => e.Salary)); } } else { switch (sort.Field) { case Field.Id: return(query.OrderByDescending(e => e.Id)); case Field.Login: return(query.OrderByDescending(e => e.Login)); case Field.Name: return(query.OrderByDescending(e => e.Name)); default: return(query.OrderByDescending(e => e.Salary)); } } }
public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); } var modelName = bindingContext.ModelName; // Try to fetch the value of the argument by name var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); if (valueProviderResult == ValueProviderResult.None) { return(AddModelError(bindingContext)); } bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); var queryParts = bindingContext.HttpContext.Request.QueryString.Value.Split('='); var value = queryParts[queryParts.Length - 1]; if (string.IsNullOrEmpty(value)) { return(AddModelError(bindingContext)); } if (value.Length < 3 || value.Length > 7) { return(AddModelError(bindingContext)); } var model = new EmployeeSortOptions(); var firstLetter = value[0]; switch (firstLetter) { case '+': model.Order = Order.Asc; break; case '-': model.Order = Order.Desc; break; default: return(AddModelError(bindingContext)); } var property = value.Substring(1).ToLower(); switch (property) { case "id": model.Field = Field.Id; break; case "login": model.Field = Field.Login; break; case "name": model.Field = Field.Name; break; case "salary": model.Field = Field.Salary; break; default: return(AddModelError(bindingContext)); } bindingContext.Result = ModelBindingResult.Success(model); return(Task.CompletedTask); }