none
Problemon optimizacion con datareader y varias consultas! RRS feed

  • Pregunta

  • Buenos días caballeros, necesito que algún sabio me ilumine.
    os pongo en situación..
    Tengo un gridview que lo voy rellenando en funcion de unas consultas pero que esta mal optimizado. Para ello me ayudo de List<List<string>> datas = new List<List<string>>()

    TENGO un gridview con 3 columnas. Las dos primeras se sacan conforme a la primera consulta y sin mas son un id, un nombrre.
    La 3º columna se saca en base a otra consulta que va a ser un count

    PRIMERO voy recogiendo los datos y con un List <String> Y lo meto en mi aux (List<string>).
    Ademas añado una columna a 0, porque luego metere ahí valores resultantes de otras dos consultas
    Código:
    while (dataReader.Read()) {
                        List<string> aux = new List<string>();
                        int id = int.Parse(dataReader["id"].ToString());
                        string nombre = dataReader["nombre"].ToString();
                        aux.Add(id.ToString());
                        aux.Add(nombre);
                        aux.Add("0");
                        datas.Add(aux);
    
    Ahora es donde viene verdaderamente mi problema. Para rellenar bien esa 3º columna con los counts hago una consulta que me devuelve ids, y sus counts correspondientes.
    Actualizo mi List<List<string>> de la siguiente forma:
    Código:
                    dataReader = cmd.ExecuteReader();
                    //Read the data and store them in the list
                    while (dataReader.Read()) {
                        int cantCreada = int.Parse(dataReader["Creadas"].ToString());
                        string Referencia = dataReader["Referencia"].ToString();
                        SumaCantidadAReferenciaCreadas(ref datas, Referencia, cantCreada);
    
    donde ese método es:
    Código:
    private void SumaCantidadAReferenciaCreadas(ref List<List<string>> datas, string id, int cantCreada) {
                foreach (List<string> list in datas) {
                    if (list[1].ToString() == id) {
                        list[4] = (int.Parse(list[4].ToString()) + cantCreada).ToString();
                        break;
                    }
                }
            }
    
    Por ultimo ya meto mi Datas en el grid

    Lo que quiero conseguir es una manera mucho mas eficiente de buscar esos ids con su count en mi Datas y meterlos sin hacer un recorrido de todas las listas para cada registro....

    He mirado los diccionarios y asi, pero no tengo ni idea de como implantarlos. Soy bastante novato y por ahora ando aprendiendo...

    Muchas gracias y un saludo!!!
    sábado, 14 de noviembre de 2015 16:33

Todas las respuestas

  • Hola

    Trato de entender, obtienes primero el detalle y luego de los count, tus querys separados son a la misma tabla?, si es la misma tabla distintas, finalmente estan relacionados, creo que lo puedes resolver en tu misma consulta.

    supongamos que tengo una tabla asi

    id,nombre,comentario

    y quiero saber cuanto comentarios por id, haría lo siguiente.

    select id,nombre,count(comentario) from tabla group by id,nombre,comentario

    Saludos

    sábado, 14 de noviembre de 2015 17:52
  • Hola

    Trato de entender, obtienes primero el detalle y luego de los count, tus querys separados son a la misma tabla?, si es la misma tabla distintas, finalmente estan relacionados, creo que lo puedes resolver en tu misma consulta.

    supongamos que tengo una tabla asi

    id,nombre,comentario

    y quiero saber cuanto comentarios por id, haría lo siguiente.

    select id,nombre,count(comentario) from tabla group by id,nombre,comentario

    Saludos

    buenas, gracias por contestar!!
    No,no, son sobre tablas distintas. de hecho son consultas mas complicadas pero lo he puesto ahi de manera muy simple porque para el problema que tengo es un poco irrelevante. 
    La cosa es tienen que ser varias consultas las que quiero ir metiendo en distintos momentos
    sábado, 14 de noviembre de 2015 19:11
  • hola

    partamos de la base que no puedes usar un List<List<string>> para asignar datos a un gridview, eso esta mal

    deberias definir una clase como ser

    public class Persona{
       public int Id {get;set;}
       public string Nombre{get;set;}
    }

    entonces usarias

    List<Persona> personaList= new List<Persona>();
    
    while (dataReader.Read()) {
    
       Persona p = new Persona(){
           id = int.Parse(dataReader["id"].ToString())
           nombre = dataReader["nombre"].ToString()
       };
    
       personaList.Add(p);
    
    }

    recorres el reader y vas agregando instancias a la entidad, esa lista es la que vinculas al grid definiendo als propeidade de la clase que mepan con las columnas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 14 de noviembre de 2015 19:20
  • >>Lo que quiero conseguir es una manera mucho mas eficiente de buscar esos ids con su count en mi Datas

    aqui hay algo conceptualmente incorrecto, los id son idnetificadores unicos de la entidad, no puede agrupar por un id porque estos NUNCA se repiten

    podrias ver cuantas ventas tiene una persona, o productos mas vendidos, pero en estos cruzas informacion para agrupar, hacerlo por el id de una entidad simpel no aplica

    ademas si querias agrupar hubieras usado el GROUP BY de sql o sino el de linq

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 14 de noviembre de 2015 19:25
  • mmmm creo que no me he explicado correctamente. Voy por partes...
    entiendo lo que dices de las clases, pero que problema hay el hacer un list de list de strings, viene a ser lo mismo que lo que me propones.
    Eso no soluciona mi problema porque vale, metes el id y el nombre, y ya tienes esas dos columnas. El problema y es lo que te indico en el post original es que si ahora me viene otra consulta, donde tengo una select con ids y por ejemplo un count, que quiero que sea mi tercera columna del grid view como puedo hacerlo de manera optima. Com lo hago ahora es de una manera ineficiente que es:

    private void SumaCantidadAReferenciaCreadas(ref List<List<string>> datas, string id, int cantCreada) {
                foreach (List<string> list in datas) {
                    if (list[1].ToString() == id) {
                        list[4] = (int.Parse(list[4].ToString()) + cantCreada).ToString();
                        break;

    Por ultimo y meto mi Datas en el grid. 

    Esta es la parte que deseo optimizar, si hay alguna forma de dado un nuevo datar reader, el no tener que ir buscando uno a uno en mi lista de lista y actualizarle esa columna. 
    Espero que ahora me haya explicado un poquito mejor :(

    domingo, 15 de noviembre de 2015 0:29
  • creo que no me he explicado muy bien. 
    Me refiero yo tengo mi list de list de string datas con 3 columnas (ID,nombre, un count)
    estan todas rellenas, solo que la columna 3, la del count esta con todo 0's porque la calculo luego con otra nueva consulta.
    Una vez hago otro data reader donde tengo ides y counts, lo que hago es ir buscando uno a uno estos ides en mi lista de listas y cuando coinciden, actualizo ese 0 por este nuevo valor. Repito esto para cada dato de la nueva consulta.

    Y esto justamente, es lo que me gustaría hacer de otra manera porque es ineficiente, el volver a ir recorriendo cada idea de la lista de listas y actualizando esa 3 columna.

    Un saludo!

    domingo, 15 de noviembre de 2015 0:32
  • >>Lo que quiero conseguir es una manera mucho mas eficiente de buscar esos ids con su count en mi Datas

    aqui hay algo conceptualmente incorrecto, los id son idnetificadores unicos de la entidad, no puede agrupar por un id porque estos NUNCA se repiten

    podrias ver cuantas ventas tiene una persona, o productos mas vendidos, pero en estos cruzas informacion para agrupar, hacerlo por el id de una entidad simpel no aplica

    ademas si querias agrupar hubieras usado el GROUP BY de sql o sino el de linq

    saludos

    mmm no me deja citarte en los mensajes a aveces, asi que abajo te pongo . Muchs gracias!
    domingo, 15 de noviembre de 2015 15:34
  • hola

    partamos de la base que no puedes usar un List<List<string>> para asignar datos a un gridview, eso esta mal

    deberias definir una clase como ser

    public class Persona{
       public int Id {get;set;}
       public string Nombre{get;set;}
    }

    entonces usarias

    List<Persona> personaList= new List<Persona>();
    
    while (dataReader.Read()) {
    
       Persona p = new Persona(){
           id = int.Parse(dataReader["id"].ToString())
           nombre = dataReader["nombre"].ToString()
       };
    
       personaList.Add(p);
    
    }

    recorres el reader y vas agregando instancias a la entidad, esa lista es la que vinculas al grid definiendo als propeidade de la clase que mepan con las columnas

    saludos


    Lo siento, me interesa probar por curiosidad a hacer esto, pero no logro entender como hacerlo. Una vez meto las personas a mi personaList. Podrias indicarme si no es mucha molesta ("pa tontos" ) como lograrlo?. Soy bastante nuevo en esto y la verdad que me esta costando.
    Muchas gracias figura
    domingo, 15 de noviembre de 2015 21:49