none
Cómo controlar DateTime RRS feed

  • Pregunta

  • Buenos días,

    Quería preguntaros, ¿cómo controlar que han pasado "n" días?

    Yo en una vista tengo unos datos que le paso vía Base de Datos y me gustaría que estos se actualizasen solamente cuando hayan pasado 2 días.

    Me explico:

    Yo aquí cojo una List<T> con muchos registros de la que luego seleccionaré solamente 5 aleatorios:

            public List<JugadorNBA> cargarMercadoFichajes()
            {
                List<JugadorNBA> jugadoresEnElMercado = new List<JugadorNBA>();
                using (SqlConnection miConexion = new SqlConnection())
                {
                    miConexion.ConnectionString = ConfigurationManager.ConnectionStrings["conexionDB"].ConnectionString;
                    try
                    {
                        miConexion.Open();
                        SqlCommand cmd =
                            new SqlCommand("SELECT * FROM TablaJugadores WHERE User_Owner IS NULL;", miConexion);
                        SqlDataReader dr = cmd.ExecuteReader();
                        if (dr.HasRows)
                        {
                            int i = 0;
                            while (dr.Read())
                            {
                                jugadoresEnElMercado.Add(new JugadorNBA(dr["Jugador"].ToString(), dr["Posicion"].ToString(), dr["Equipo"].ToString(),
                                    new ValoracionJugador(Int32.Parse(dr["Puntos"].ToString()), Int32.Parse(dr["Reb_Ofensivos"].ToString()), Int32.Parse(dr["Reb_Defensivos"].ToString()),
                                    Int32.Parse(dr["Asistencias"].ToString()), Int32.Parse(dr["Robos"].ToString()), Int32.Parse(dr["Tapones"].ToString()),
                                    Int32.Parse(dr["Tiros_Campo_Intentados"].ToString()), Int32.Parse(dr["Tiros_Campo_Anotados"].ToString()), Int32.Parse(dr["Tiros_Triples_Intentados"].ToString()),
                                    Int32.Parse(dr["Tiros_Triples_Anotados"].ToString()), Int32.Parse(dr["Tiros_Libres_Intentados"].ToString()), Int32.Parse(dr["Tiros_Libres_Anotados"].ToString()),
                                    Int32.Parse(dr["Perdidas"].ToString()), Int32.Parse(dr["Faltas_Personales"].ToString()), Int32.Parse(dr["Coeficiente"].ToString()), Convert.ToBoolean(dr["Tiros_Campo_Intentados"]),
                                    Int32.Parse(dr["Partidos"].ToString()), Int32.Parse(dr["Valoracion_Total"].ToString())),
                                    Double.Parse(dr["Salario"].ToString())));
                                i++;
                            }
                            miConexion.Close();
                            return jugadoresEnElMercado;
                        }
                        else
                        {
                            miConexion.Close();
                            return null;
                        }
                    }
                    catch (SqlException ex) { return jugadoresEnElMercado; }
                    finally { miConexion.Close(); }
                }
            }

    Lo que hago en el Action es sacar 5 valores aleatorios de esta List<T>, por lo que necesitaría es almacenar esos 5 valores para que no cambien hasta que hayan pasado 2 días.

    Lo que ahora mismo tengo está mal ya que lo que hace es que si no han pasado los días directamente no me carga esa lista, yo necesitaría guardar esta lista y que se mantenga durante 2 días para que después se vuelva a cargar con otros 5 valores aleatorios:

            public ActionResult MercadoFichajes()
            {
                Random random = new Random();
                Usuario usu = ((Usuario)Session["UsuarioConectado"]);
                if (usu != null)
                {
                    DateTime date1 = new DateTime(2016,2,16,11,30,0);
                    if (DateTime.Now > date1.AddDays(2))
                    {
                        ViewBag.Jugadores = dbController.cargarMercadoFichajes().OrderBy(x => random.Next()).Take(5);
                    }
                    
                }
                return View(usu);
            }

    Gracias de antemano y saludos!



    José Manuel de la Cruz

    jueves, 18 de febrero de 2016 10:41

Respuestas

  • Entiendo que los 5 valores a mostrar serán los mismos para todos los usuarios ¿no? ¿o dependen del usuario conectado?

    Para mantener esta información durante dos días deberías almacenarlos en un almacenamiento persistente del que puedas recuperarlos durante estos dos días.

    Podrías utilizar el objeto Application para almacenar tanto la fecha en la que se recuperaron los valores como los 5 valores a mostrar. De esta forma comprobando la fecha de recuperación puedes saber si debes realizar la consulta de nuevo.

    La pega es que en el objeto Application los valores se mantendrán durante los dos días siempre y cuando tu aplicación web se mantenga en ejecución. Es decir, siempre que no se reinicie el servidor o el servicio del IIS, o se recicle el pool.

    Para asegurarte de que la información va a mantenerse durante los dos días que necesitas deberías utilizar un medio de almacenamiento más persistente como la base de datos o el sistema de archivos.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JM de la Cruz sábado, 20 de febrero de 2016 16:45
    jueves, 18 de febrero de 2016 11:43

Todas las respuestas

  • >>Lo que ahora mismo tengo está mal ya que lo que hace es que si no han pasado los días directamente no me carga esa lista, yo necesitaría guardar esta lista y que se mantenga durante 2 días para que después se vuelva a cargar con otros 5 valores aleatorios

    Podrias conservar esa seleccion en el cache, configurando que este expire a los dos dias

    Entonces mientras el cache este con seleccion y aun no haya expirado mostraras esa lista, cuando expire la recargas con una nuevo

    Caching Data in an ASP.NET Web Pages (Razor) Site for Better Performance

    tambien puede usar el cache de view como atributo en el action

    Caching infrastructure in MVC4 with C#: caching controller actions

    hay varias formas de implementar cache, analiza cual te resulta mejor para este caso

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 18 de febrero de 2016 11:41
  • Entiendo que los 5 valores a mostrar serán los mismos para todos los usuarios ¿no? ¿o dependen del usuario conectado?

    Para mantener esta información durante dos días deberías almacenarlos en un almacenamiento persistente del que puedas recuperarlos durante estos dos días.

    Podrías utilizar el objeto Application para almacenar tanto la fecha en la que se recuperaron los valores como los 5 valores a mostrar. De esta forma comprobando la fecha de recuperación puedes saber si debes realizar la consulta de nuevo.

    La pega es que en el objeto Application los valores se mantendrán durante los dos días siempre y cuando tu aplicación web se mantenga en ejecución. Es decir, siempre que no se reinicie el servidor o el servicio del IIS, o se recicle el pool.

    Para asegurarte de que la información va a mantenerse durante los dos días que necesitas deberías utilizar un medio de almacenamiento más persistente como la base de datos o el sistema de archivos.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JM de la Cruz sábado, 20 de febrero de 2016 16:45
    jueves, 18 de febrero de 2016 11:43
  • Muchas gracias por las respuestas

    Probaré vuestras soluciones, a ver si soy capaz de conseguirlo.

    Saludos 


    José Manuel de la Cruz

    jueves, 18 de febrero de 2016 12:53