public async Task <ActionResult> GetEvents(int?page, int?limit, decimal?lat, decimal?lng, string title) { try { IEnumerable <EventViewModel> _items = null; int _page = page ?? 0; int _limit = limit ?? 0; int _totalpages = 0; _limit = _limit == 0 || _limit > 10 ? 10 : _limit; if (_page > 0 && _limit > 0) { Expression <Func <Event, bool> > criteria = null; if (string.IsNullOrEmpty(title) && lat == null && lng == null) { criteria = e => true; } else if (!string.IsNullOrEmpty(title)) { criteria = e => e.Title == title; } IReadOnlyList <Event> eventsTask = null; EventFilterPaginatedSpecification filterPaginatedSpecification = null; if (criteria != null) { filterPaginatedSpecification = new EventFilterPaginatedSpecification(_limit * (_page - 1), _limit, criteria); eventsTask = await _repository.List(filterPaginatedSpecification); } else if (lat != null && lng != null) { var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326); var myLocation = geometryFactory.CreatePoint(new Coordinate(double.Parse(lng.ToString()), double.Parse(lat.ToString()))); criteria = e => e.Location.IsWithinDistance(myLocation, 3000); var events = await _repository.GetWhere(criteria); events = events.OrderBy(o => o.Location.Distance(myLocation)); int _skip = _limit * (_page - 1); eventsTask = events.Skip(_skip).Take(_limit).ToList(); } if (eventsTask != null) { _items = eventsTask.Select(s => new EventViewModel() { Id = s.EventId, Title = s.Title, Description = s.Description, Date = s.Date, Image = s.Image, Attendances = s.Attendances, WillYouAttend = s.WillYouAttend }); int totalItems = await _repository.CountWhere(criteria); _totalpages = int.Parse(Math.Ceiling(((decimal)totalItems / _limit)).ToString()); } } else { var eventsTask = await _repository.GetAll(); if (eventsTask.Any()) { _items = eventsTask.Select(s => new EventViewModel() { Id = s.EventId, Title = s.Title, Description = s.Description, Date = s.Date, Image = s.Image, Attendances = s.Attendances, WillYouAttend = s.WillYouAttend }); int totalItems = await _repository.CountAll(); _items = _limit > 0 ? _items.Take(_limit) : _items; } } if (_page == 0) { _page = 1; } if (_totalpages == 0) { _totalpages = 1; } return(Ok(new EventViewModelResponse() { Page = _page, Pages = _totalpages, Items = _items })); } catch (Exception ex) { LogException(ex); return(StatusCode(500, "Error al obtener los eventos")); } }