none
Necesitamos saber cual es la forma más optima de lanzar (y utilizar) una consulta LINQ. RRS feed

  • Pregunta

  • Trabajamos en un entorno de Listas de objetos List<T_BANCOS>.

    Ejemplo sencillo. Tabla de Bancos y queremos obtener solamente 2 campos en vez de toda la tabla de bancos.

    Sabemos que existen multiples formas de hacerlo pero nos gustaría saber cual es la forma más optima (y que diferencias podemos tener entre las 2) de obtener dos columnas (de 40 columnas que puede tener la tabla) de una tabla de bancos. "Utilizando List<T_BANCOS>" o "IQueryable<T_BANCOS>"

    Ej1: 

    Devuelve "IQueryable<T_BANCOS>".

    var Query = from bancos in _contexto.T_BANCOS
                                 select new { bancos.BANCOS_ENTIDAD, bancos.BANCOS_NOMBRE };

    return Query;

    Ej2:

    Devuelve "List<T_BANCOS>".

    IQueryable<T_BANCOS> Querry = from bancos in _contexto.T_BANCOS
                                                  select bancos;
                    // return Querry;


                    List<T_BANCOS> ListaBancos = new List<T_BANCOS>();
                    T_BANCOS banco;


                    foreach (T_BANCOS b in Querry)
                    {
                        banco = new T_BANCOS();
                        banco.BANCOS_ENTIDAD = b.BANCOS_ENTIDAD;
                        banco.BANCOS_NOMBRE = b.BANCOS_NOMBRE;
                        ListaBancos.Add(banco);
                    }

    return ListaBancos;


    I.L.

    jueves, 16 de febrero de 2012 12:53

Respuestas

  • Hola,

    Por lo visto no es posible crear entidades en un IQueryable, por lo que se debe realizar a posteriori.

    Cuando haces un new dentro del select, si no le indicas el tipo, pasa a ser un objeto de tipo anónimo, por lo que no está realmente tipado.

    La unica opción para hacerlo en un único paso sería que en vez de utilizar la entidad T_BANCOS, te crearas otra reducida T_BANCOS_DATOS en la que solo existieran estos dos campos y pudieras lanzar tu consulta del siguiente modo:

    return (from bancos in _contexto.T_BANCOS_DATOS
                  select bancos).ToList();

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.

    • Marcado como respuesta I.L_ jueves, 16 de febrero de 2012 15:14
    jueves, 16 de febrero de 2012 15:08

Todas las respuestas

  • Hola,

    Habeis pensado en esta otra manera:

    var Query = from bancos in _contexto.T_BANCOS
                select new T_BANCOS {BANCOS_ENTIDAD = bancos.BANCOS_ENTIDAD, BANCOS_NOMBRE = bancos.BANCOS_NOMBRE };
     
    var Bancos = Query.ToList();

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.


    • Editado JA Reyes jueves, 16 de febrero de 2012 13:15
    jueves, 16 de febrero de 2012 13:13
  • Hola

    El primer ejemplo es mas optimo porque solo consulta 2 campos en la base de datos a diferencia del segundo ejemplo que consulta todos los campos.

    Si necesitas una coleccion de tipo List<>, puedes llamar al metodo ToList() de IQueryable, es decir, podrias hacer algo como esto:

    var Query = from bancos in _contexto.T_BANCOS
                                 select new { bancos.BANCOS_ENTIDAD, bancos.BANCOS_NOMBRE };
    
    return Query.ToList();

    SALUDOS


    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    DCE 5 ESTRELLAS PLATINO
    Pedro Marquez - Venezuela

    jueves, 16 de febrero de 2012 13:21
  • No es posible hacer esto, ya que cuando ejecutas la instrucción:

    return Query.ToList();

    Se produce el siguiente error: 

    "No se permite la construcción explícita del tipo de entidad 'miDataContext.T_BANCOS' en una consulta."

    Es decir, no puedo convertirla en una List<T_BANCOS>.



    I.L.

    jueves, 16 de febrero de 2012 14:34
  • Hola de nuevo,

    Tendrías entonces que hacerlo sin onbener una lista tipada, de este modo:

    var Query = from bancos in _contexto.T_BANCOS
                select new {bancos.BANCOS_ENTIDAD, bancos.BANCOS_NOMBRE };
     
    var Bancos = Query.ToList();

    O si lo necesitas obligatoriamente tipado, en 2 pasos:

    var Query1 = from bancos in _contexto.T_BANCOS
                select new {bancos.BANCOS_ENTIDAD, bancos.BANCOS_NOMBRE };
    
    var Query2 = from bancos in Query1.ToList()
                select new T_BANCOS {BANCOS_ENTIDAD = bancos.BANCOS_ENTIDAD, BANCOS_NOMBRE = bancos.BANCOS_NOMBRE };
     
    var Bancos = Query2.ToList();

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.

    jueves, 16 de febrero de 2012 14:50
  • OK! Lo necesitamos obligatoriamente tipado y con el ejemplo en 2 pasos funciona correctamente.

    Mi pregunta es la siguiente. Si el objeto entidad del DataContext T_BANCOS es un objeto tipado, ¿por qué es necesario lanzarlo en 2 pasos?

    ¿No existe una forma más optima de hacerlo en un único paso?

    Muchas gracias por las respuestas  ;-)


    I.L.

    jueves, 16 de febrero de 2012 15:00
  • Hola,

    Por lo visto no es posible crear entidades en un IQueryable, por lo que se debe realizar a posteriori.

    Cuando haces un new dentro del select, si no le indicas el tipo, pasa a ser un objeto de tipo anónimo, por lo que no está realmente tipado.

    La unica opción para hacerlo en un único paso sería que en vez de utilizar la entidad T_BANCOS, te crearas otra reducida T_BANCOS_DATOS en la que solo existieran estos dos campos y pudieras lanzar tu consulta del siguiente modo:

    return (from bancos in _contexto.T_BANCOS_DATOS
                  select bancos).ToList();

    Saludos,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.

    • Marcado como respuesta I.L_ jueves, 16 de febrero de 2012 15:14
    jueves, 16 de febrero de 2012 15:08
  • No nos convence la respuesta (porque nos gustaría que LINQ no fuera así), tener que andar creandonos objetos con los campos que necesitamos.

    Con lo bien que estamos viendo que funciona LINQ, nos decepciona esta parte...   :-(

    Muchisimas gracias JA Reyes por las respuestas y la rapidéz ;-)


    I.L.

    jueves, 16 de febrero de 2012 15:14