private async Task SaveRequest(WorkersCriteria criteria) { _dbContext .Set <CustomerSearch>() .Add(_mapper.Map <CustomerSearch>(criteria)); await _dbContext.SaveChangesAsync(); }
public async Task <WorkersResponse> Execute(WorkersCriteria criteria) { await SaveRequest(criteria); IQueryable <Customer> workers = _dbContext.Set <Customer>(); if (criteria.AgeFrom.HasValue) { workers = workers.Where(c => c.BirthDate.HasValue && c.BirthDate.Value.Year >= criteria.AgeFrom.Value); } if (criteria.AgeTo.HasValue) { workers = workers.Where(c => c.BirthDate.HasValue && c.BirthDate.Value.Year <= criteria.AgeTo.Value); } if (criteria.WorkerType.HasValue) { workers = workers.Where(c => c.SearchType == criteria.WorkerType.Value); } if (!criteria.DistanceUntil.HasValue || !criteria.DistanceLat.HasValue || !criteria.DistanceLng.HasValue) { throw new ArgumentNullException(nameof(criteria), "lat_or_lng_undefined"); } var lat = criteria.DistanceLat.Value.ToString(CultureInfo.GetCultureInfo("en-GB")); var lng = criteria.DistanceLng.Value.ToString(CultureInfo.GetCultureInfo("en-GB")); var dbGeography = DbGeography.PointFromText($"POINT({lng:R} {lat:R})", 4326); /* lar range */ var distance = criteria.DistanceUntil.Value * 1000; workers = CutLocationRange(distance, criteria.DistanceLat.Value, criteria.DistanceLng.Value, workers); workers = workers .Where( c => c.Address.Details.Location.Distance(dbGeography) <= distance); return(new WorkersResponse { Count = workers.Count(), Workers = workers .Include(c => c.Address.Details) .OrderBy(c => c.Address.Details.Location.Distance(dbGeography)) .Skip(criteria.Page * criteria.Count) .Take(criteria.Count) .ToArray() .Select(c => WorkerRelative.Get(dbGeography, c)) }); }
public async Task <IHttpActionResult> Get([FromUri] WorkersCriteria id) { if (RequestContext.Principal.Identity.IsAuthenticated && (!id.DistanceLat.HasValue || !id.DistanceLng.HasValue)) { var addressDetails = await _addressDetailsByUserEmailQuery.Execute(RequestContext.Principal.Identity.Name); if (addressDetails != null) { id.DistanceLat = addressDetails.Lat; id.DistanceLng = addressDetails.Lng; } } if (id.Count <= 0) { id.Count = 100; } return(Ok(await _workersQuery.Execute(id))); }