none
Problemas Con IQueryable en Entity Framework y C# RRS feed

  • Pregunta

  • Hola a todos buenas tardes. tengo este inconveniente leyendo un poco sobre Ienumerable e IQueryable creo que me quedo con IQueryable

    ahora tengo este código y me funciona muy bien

    using (GourmetEntities db = new GourmetEntities())
                {
                    IQueryable<tblProducto> ListaProductos = from lp in db.tblProductos
                                                             where lp.Categoria_Id == Id
                                                             select lp;
                    botonesProductos = new List<Button>();
                    foreach (var producto in ListaProductos)
                    {
                        Byte[] bytes;
                        MemoryStream ms;
                        bytes = (byte[])producto.Imagen;
                        ms = new MemoryStream(bytes);
                        boton = new Button();
                        boton.Size = new Size(80, 80);
                        //boton.Location = new Point(x, y); // Lo comenteo yo
                        //boton.Image = producto.Imagen; // Lo comente yo original
                        boton.Image = new Bitmap(ms); // Lo cambie
                        boton.Text = producto.ProductoDescripcion;
                        boton.Tag = producto.Id.ToString();
                        boton.Click += new EventHandler(botonProducto_Click);
                        botonesProductos.Add(boton);
                        flowLayoutPanel2.Controls.Clear();
                        flowLayoutPanel2.Controls.AddRange(botonesProductos.ToArray());
    
                    }
    
                }

    Pero lo tengo desde el formulario y quisiera que esté en un método en otra capa.

    por ello hago lo siguiente

    private void botonCategoria_Click(object sender, EventArgs e)
            {
                Button boton = (Button)sender;
                int Id = Convert.ToInt32(boton.Tag);
    
                    IQueryable<tblProducto> ListaProductos = Producto.IListaProductos(Id);
                    botonesProductos = new List<Button>();
                    foreach (var producto in ListaProductos)
                    {
                        Byte[] bytes;
                        MemoryStream ms;
                        bytes = (byte[])producto.Imagen;
                        ms = new MemoryStream(bytes);
                        boton = new Button();
                        boton.Size = new Size(80, 80);
                        //boton.Location = new Point(x, y); // Lo comenteo yo
                        //boton.Image = producto.Imagen; // Lo comente yo original
                        boton.Image = new Bitmap(ms); // Lo cambie
                        boton.Text = producto.ProductoDescripcion;
                        boton.Tag = producto.Id.ToString();
                        boton.Click += new EventHandler(botonProducto_Click);
                        botonesProductos.Add(boton);
                        flowLayoutPanel2.Controls.Clear();
                        flowLayoutPanel2.Controls.AddRange(botonesProductos.ToArray());
                    }
            }

    y el método es este

     public static IQueryable<tblProducto> IListaProductos(int IdCategoria)
            {
                tblProducto producto = new tblProducto();
                using (GourmetEntities db = new GourmetEntities())
                {
                 var lts = (from lt in db.tblProductos
                           where lt.Categoria_Id == IdCategoria
                           select lt);
                    return lts;
                }
            }

    pero me viene este mensaje de error

    Por favor, como lo puedo implementar ya que me gustaría que esté en un método

    Muchas gracias.

    Roberto

    viernes, 17 de abril de 2020 21:50

Respuestas

  • hola

    No puedes salir del bloque using del contexto de EF sin haber ejecutado la query ya que pierdes los datos de conexion y demas que requiere

    Cuando usas un IQueryable aunque la query no se ejecuto contra la db, por lo tanto debes estar dentro del contexto activo

    Tienes que usar

    public static List<tblProducto> ListaProductos(int IdCategoria)
    {
    	using (GourmetEntities db = new GourmetEntities())
    	{
    		var lts = from lt in db.tblProductos
    				   where lt.Categoria_Id == IdCategoria
    				   select lt;
    			   
    		return lts.ToList();
    	}
    }

    para eejcutar la query cuando el contexto aun esta instanciado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 18 de abril de 2020 4:02

Todas las respuestas

  • Hola Roberto

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, vamos a darte seguimiento e investigaremos para buscar la mejor respuesta para ti.

     

    Gracias por usar los foros de MSDN.

     

    Eric Ruiz

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 17 de abril de 2020 22:45
    Moderador
  • Muchas gracias.

    Aguardo


    viernes, 17 de abril de 2020 22:52
  • hola

    No puedes salir del bloque using del contexto de EF sin haber ejecutado la query ya que pierdes los datos de conexion y demas que requiere

    Cuando usas un IQueryable aunque la query no se ejecuto contra la db, por lo tanto debes estar dentro del contexto activo

    Tienes que usar

    public static List<tblProducto> ListaProductos(int IdCategoria)
    {
    	using (GourmetEntities db = new GourmetEntities())
    	{
    		var lts = from lt in db.tblProductos
    				   where lt.Categoria_Id == IdCategoria
    				   select lt;
    			   
    		return lts.ToList();
    	}
    }

    para eejcutar la query cuando el contexto aun esta instanciado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 18 de abril de 2020 4:02
  • Hola, deberías devolver un IEnumerable a tu capa de "presentación", como bien ha dicho Leandro, el uso del bloque "using" hace que tu contexto haga el Dispose() de forma automática, con lo que cuando desde tu capa "presentación" ejecutas la consulta en el bloque foreach, el contexto ya no se encuentra disponible. 

    Si trabajas en capas deja a la capa de acceso a datos que haga el trabajo y ejecute la consulta y a la de presentación la tarea de "pintar" esos datos obtenidos.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 18 de abril de 2020 14:43
    Moderador
  • Leandro, Sergio Muchas gracias.

    Roberto

    domingo, 19 de abril de 2020 18:44