public async Task <AmbassadorModel> GetAmbassadorAutoAssignAsync(OrderModel order) { AmbassadorModel closestAmbassador = null; DbGeography location = order.OrderRequestor.Location; closestAmbassador = await _db.AmbassadorModels.Include(p => p.User).Include(p => p.RefusedOrders) .OrderBy(p => p.Location.Distance(location)) .FirstOrDefaultAsync(p => (p.Location.Distance(location) / 1000) <= 50d && p.User.EmailConfirmed && !p.RefusedOrders.Any(x => x.OrderId == order.Id) && !p.OrderModel.Any(o => o.Status == OrderStatus.PreAssigned || o.Status == OrderStatus.Pending || o.Status == OrderStatus.Ready || o.Status == OrderStatus.ArrangeDelivery)); if (closestAmbassador == null) { HttpResponseMessage response = await CallAndreaniApiAsync(); if (!response.IsSuccessStatusCode) { return(closestAmbassador); } string content = await response.Content.ReadAsStringAsync(); XDocument createXml = XDocument.Parse(content); IEnumerable <UbicacionAndreani> ubicaciones = createXml.Descendants("item").Select(p => new UbicacionAndreani { Descripcion = p.Element("Descripcion").Value, Direccion = p.Element("Direccion").Value, HoradeTrabajo = p.Element("HoradeTrabajo").Value, Latitud = p.Element("Latitud").Value, Longitud = p.Element("Longitud").Value, Mail = p.Element("Mail").Value, Numero = p.Element("Numero").Value, Responsable = p.Element("Responsable").Value, Resumen = p.Element("Resumen").Value, Sucursal = p.Element("Sucursal").Value, Telefono1 = p.Element("Telefono1").Value, Telefono2 = p.Element("Telefono2").Value, Telefono3 = p.Element("Telefono3").Value, TipoSucursal = p.Element("TipoSucursal").Value, TipoTelefono1 = p.Element("TipoTelefono1").Value, TipoTelefono2 = p.Element("TipoTelefono2").Value, TipoTelefono3 = p.Element("TipoTelefono3").Value, Location = SiteHelper.GeneratePoint($"{p.Element("Latitud").Value},{p.Element("Longitud").Value}".Split(',')) }); var listAmbassadors = await _db.AmbassadorModels .Include(p => p.User) .Include(p => p.RefusedOrders) .Where(p => p.User.EmailConfirmed && !p.RefusedOrders.Any(x => x.OrderId == order.Id) && !p.OrderModel.Any(o => o.Status == OrderStatus.PreAssigned || o.Status == OrderStatus.Pending || o.Status == OrderStatus.Ready || o.Status == OrderStatus.ArrangeDelivery)) .OrderBy(p => p.Location.Distance(p.Location)) .ToListAsync(); closestAmbassador = listAmbassadors.FirstOrDefault(p => ubicaciones.Any(x => (x.Location.Distance(p.Location) / 1000) <= 20d)); } return(closestAmbassador); }