private static Expression <Func <CarEntity, bool> > BuildFilterExpression(CarQueryModel query)
        {
            Expression <Func <CarEntity, bool> > filter = x => true;

            // by id
            if (query.Id != null && query.Id.Any())
            {
                var prefix = filter.Compile();
                filter = x => prefix(x) && query.Id.Contains((int)x.Id);
            }

            // by name
            if (query.Name != null && query.Name.Any())
            {
                var prefix = filter.Compile();
                filter = x => prefix(x) && query.Name.Contains(x.Name);
            }

            // by manufacturer
            if (query.Manufacturer != null && query.Manufacturer.Any())
            {
                var prefix = filter.Compile();
                filter = x => prefix(x) && query.Manufacturer.Contains(x.Manufacturer);
            }

            return(filter);
        }
Beispiel #2
0
        public IEnumerable <Car> Get(CarQueryModel model)
        {
            IQueryable <Car> cars = db.Cars;

            if (!string.IsNullOrWhiteSpace(model.Make))
            {
                cars = cars.Where(c => string.Equals(c.CarMake, model.Make, StringComparison.CurrentCultureIgnoreCase));
            }

            if (!string.IsNullOrWhiteSpace(model.Model))
            {
                cars = cars.Where(c => string.Equals(c.CarModel, model.Model, StringComparison.CurrentCultureIgnoreCase));
            }

            if (!string.IsNullOrWhiteSpace(model.Color))
            {
                cars = cars.Where(c => string.Equals(c.CarColor, model.Color, StringComparison.CurrentCultureIgnoreCase));
            }

            if (model.Year.HasValue)
            {
                cars = cars.Where(c => c.CarYear == model.Year.Value);
            }

            return(cars);
        }
        public ActionResult <PaginatedModel <CarModel> > Get([FromQuery] CarQueryModel query)
        {
            var models = _carService.Get(query);

            if (models == null || models.Results == null || !models.Results.Any())
            {
                return(NotFound());
            }

            return(models);
        }
Beispiel #4
0
 public Task <IEnumerable <CarViewModel> > FindModels(CarQueryModel query)
 {
     return(Task.FromResult <IEnumerable <CarViewModel> >(new List <CarViewModel> {
         new CarViewModel
         {
             Brand = query.Brand,
             Color = query.Color,
             Name = $"{query.Brand} {query.Name} 1.6",
             Price = 4034,
             Availabe = true,
             Year = query.Year
         }
     }));
 }
        public PaginatedModel <CarModel> Get(CarQueryModel query)
        {
            var(sort, ascending) = GetSortDefinition(query);
            var filter = BuildFilterExpression(query);

            var(sortDefinition, includeDrivers) = GetProjection(query);

            var getResponse = DataRepository.Get(filter, sortDefinition, sort, ascending, query.Page, query.PageSize);

            return(new PaginatedModel <CarModel>
            {
                Page = query.Page,
                PageSize = query.PageSize,
                TotalCount = getResponse.totalCount,
                Results = AddDriversAndGetModels(getResponse.entities, includeDrivers)
            });
        }
        private (Func <CarEntity, object>, bool) GetSortDefinition(CarQueryModel query)
        {
            var sort = _sortDefinitions[nameof(CarEntity.Id).ToLowerInvariant()];

            var sortOperator = query.Sort.Substring(0, 1);
            var sortField    = query.Sort.Substring(1).ToLowerInvariant();

            var ascending = sortOperator == "+"
                ? true
                : sortOperator != "-";

            if (_sortDefinitions.ContainsKey(sortField))
            {
                sort = _sortDefinitions[sortField];
            }

            return(sort, ascending);
        }
        private static (Func <CarEntity, CarEntity> sortDefinition, bool includeDrivers) GetProjection(CarQueryModel query)
        {
            Func <CarEntity, CarEntity> projection = null;
            var includeDrivers = true;

            if (query.Field != null && query.Field.Any())
            {
                projection = x => new CarEntity
                {
                    Id           = x.Id,
                    Color        = query.Field.Contains(nameof(x.Color).ToLowerInvariant()) ? x.Color : null,
                    Model        = query.Field.Contains(nameof(x.Model).ToLowerInvariant()) ? x.Model : null,
                    Manufacturer = query.Field.Contains(nameof(x.Manufacturer).ToLowerInvariant()) ? x.Manufacturer : null,
                    Name         = query.Field.Contains(nameof(x.Name).ToLowerInvariant()) ? x.Name : null,
                    SerialNumber = query.Field.Contains(nameof(x.SerialNumber).ToLowerInvariant()) ? x.SerialNumber : null
                };

                includeDrivers = query.Field.Contains(nameof(CarModel.Drivers).ToLowerInvariant());
            }

            return(projection, includeDrivers);
        }
Beispiel #8
0
 public async Task <ActionResult <IEnumerable <CarViewModel> > > Get(
     [FromQuery, ModelBinder(typeof(RouteQueryModelBinder))] CarQueryModel query
     )
 {
     return(Ok(await _carModelsService.FindModels(query)));
 }