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);
            }
        }
Example #2
0
        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));
                }
            }
        }
Example #4
0
        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);
        }