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); }
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); }
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); }
public async Task <ActionResult <IEnumerable <CarViewModel> > > Get( [FromQuery, ModelBinder(typeof(RouteQueryModelBinder))] CarQueryModel query ) { return(Ok(await _carModelsService.FindModels(query))); }