public List <DatosMapaRetorno> datosMapa([FromBody] DatosMapaInput data) { ConexionEspol conexionEspol = new ConexionEspol(); List <DatosMapaWS> datosQuery = JsonConvert.DeserializeObject <List <DatosMapaWS> >(conexionEspol.datosMapa(data.Fecha).Result); Dictionary <int, DatosMapaRetorno> cantPorLugar = new Dictionary <int, DatosMapaRetorno>(); Dictionary <int, List <string> > latsYLongs = new Dictionary <int, List <string> >(); Dictionary <int, int> hijoPadre = new Dictionary <int, int>(); foreach (var dato in datosQuery) { int idUsar = dato.idLugar; string latitud = dato.latitud; string longitud = dato.longitud; //Si es null, busco en la base local o en los diccionarios if (latitud == null || longitud == null) { if (hijoPadre.ContainsKey(dato.idLugar)) { latitud = latsYLongs[hijoPadre[dato.idLugar]][0]; longitud = latsYLongs[hijoPadre[dato.idLugar]][1]; idUsar = hijoPadre[dato.idLugar]; } else if (latsYLongs.ContainsKey(dato.idLugar)) { latitud = latsYLongs[dato.idLugar][0]; longitud = latsYLongs[dato.idLugar][1]; } else { var latLong = this.buscarLatitudYLongitud(dato.idLugar); latitud = latLong[0]; longitud = latLong[1]; if (latitud != null && longitud != null) { latsYLongs.Add(dato.idLugar, latLong); } } } //Si sigue siendo null, busco la información del padre en la base local y en la base de espol if ((latitud == null || longitud == null) && !hijoPadre.ContainsKey(dato.idLugar)) { var idPadre = JsonConvert.DeserializeObject <IdPadre>(conexionEspol.idLugarPadre(dato.idLugar).Result); var latLong = this.buscarLatitudYLongitud(idPadre.idPadre, true); latitud = latLong[0]; longitud = latLong[1]; if (!latsYLongs.ContainsKey(idPadre.idPadre)) { latsYLongs.Add(idPadre.idPadre, latLong); } hijoPadre.Add(dato.idLugar, idPadre.idPadre); idUsar = hijoPadre[dato.idLugar]; } if (!cantPorLugar.ContainsKey(idUsar)) { cantPorLugar.Add(idUsar, new DatosMapaRetorno { lat = latitud, lng = longitud, count = 0, }); } cantPorLugar[idUsar].count += dato.numRegistrados; } var reuniones = context.TBL_Reunion.Where(x => x.cancelada == "F" && x.fechaInicio <= data.Fecha && x.fechaFin > data.Fecha).ToList(); foreach (Reunion reunion in reuniones) { int idUsar = reunion.idLugar; string latitud = null; string longitud = null; if (hijoPadre.ContainsKey(reunion.idLugar)) { latitud = latsYLongs[hijoPadre[reunion.idLugar]][0]; longitud = latsYLongs[hijoPadre[reunion.idLugar]][1]; idUsar = hijoPadre[reunion.idLugar]; } else if (latsYLongs.ContainsKey(reunion.idLugar)) { latitud = latsYLongs[reunion.idLugar][0]; longitud = latsYLongs[reunion.idLugar][1]; } else { var latLong = this.buscarLatitudYLongitud(reunion.idLugar); latitud = latLong[0]; longitud = latLong[1]; if (latitud != null && longitud != null) { latsYLongs.Add(reunion.idLugar, latLong); } } //Si sigue siendo null, busco la información del padre en la base local y en la base de espol if ((latitud == null || longitud == null) && !hijoPadre.ContainsKey(reunion.idLugar)) { var idPadre = JsonConvert.DeserializeObject <IdPadre>(conexionEspol.idLugarPadre(reunion.idLugar).Result); var latLong = this.buscarLatitudYLongitud(idPadre.idPadre, true); latitud = latLong[0]; longitud = latLong[1]; if (!latsYLongs.ContainsKey(idPadre.idPadre)) { latsYLongs.Add(idPadre.idPadre, latLong); } hijoPadre.Add(reunion.idLugar, idPadre.idPadre); idUsar = hijoPadre[reunion.idLugar]; } if (!cantPorLugar.ContainsKey(idUsar)) { cantPorLugar.Add(idUsar, new DatosMapaRetorno { lat = latitud, lng = longitud, count = 0, }); } cantPorLugar[idUsar].count += this.context.TBL_Invitacion.Where(x => x.idReunion == reunion.id && x.estado == "A" && x.cancelada == "F").Count() + 1; //+1 por el id del creador; } return(cantPorLugar.Values.ToList()); }