예제 #1
0
        public async Task GetCinemaLessThan5Kilometers()
        {
            var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);

            using (var context = LocalDataBaseInitializer.GetDbContextLocalDb(false))
            {
                var cinemas = new List <Cinema>()
                {
                    new Cinema {
                        Name = "Agora", Location = geometryFactory.CreatePoint(new Coordinate(-69.9388777, 18.4839233))
                    }
                };

                context.AddRange(cinemas);
                await context.SaveChangesAsync();
            }

            var filtro = new CinemaNearFilterDTO()
            {
                DistanceKms = 5,
                Latitude    = 18.481139,
                Longitude   = -69.938950
            };

            using (var context = LocalDataBaseInitializer.GetDbContextLocalDb(false))
            {
                var mapper     = ConfigurationAutoMapper();
                var controller = new CinemasController(context, mapper, geometryFactory);
                var response   = await controller.Nearby(filtro);

                var value = response.Value;
                Assert.AreEqual(2, value.Count);
            }
        }
예제 #2
0
        public async Task <ActionResult <List <CinemaNearDTO> > > Nearby([FromQuery] CinemaNearFilterDTO filter)
        {
            var locationUser = _geometryFactory.CreatePoint(new Coordinate(filter.Longitude, filter.Latitude));

            var cinemas = await _context.Cinemas
                          .Where(x => x.Location.IsWithinDistance(locationUser, filter.DistanceKms * 1000))
                          .OrderBy(x => x.Location.Distance(locationUser))
                          .Select(x => new CinemaNearDTO
            {
                Id             = x.Id,
                Name           = x.Name,
                Longitude      = x.Location.X,
                Latitude       = x.Location.Y,
                DistanceMeters = Math.Round(x.Location.Distance(locationUser))
            }).ToListAsync();

            return(cinemas);
        }