none
Consulta LinQ Mostrar Datos de Dos Tablas en BD RRS feed

  • Pregunta

  • Hola buen día, saludos y disculpen la molestia estoy trantando de realizar una consulta en linq to entities, donde consulta una tabla de Ventas en sql server, pero el problema es que existe una tabla llamada Venta Detalles 

    1. Son las tablas 



    2. Como ven Cada Detalle contiene una venta, ahora yo tengo una consulta que manda a traer la venta y el detalle de venta por el id

     List<MostrarVenta> lmv = new List<MostrarVenta>();
                List<Venta> lv = rcr.GetVentaByDates(dt1,dt2).ToList();
                foreach (Venta item in lv)
                {
                    List< DetalleVenta> dv = rcr.GetDetalleVentaByIdVenta(item.Id).ToList();
                    MostrarVenta mv = new MostrarVenta
                    {
                        Id = item.Id,
                        Cliente = string.Format("{0} {1}", item.Cliente.Persona.Nombre, item.Cliente.Persona.ApellidoPat),
                        NoTicket = item.NoNota,
                        FechaVenta = Convert.ToDateTime(item.FechaHoraVenta),
                        Total = item.Total,
                        TipoVenta = item.Tipo,
                        Descuento = Convert.ToDecimal(item.Descuento),
                    };
                    if (dv!=null)
                    {
                        foreach (DetalleVenta articulo in dv)
                        {
                            
                        }
    
                    }
                    lmv.Add(mv);
                }
                return lmv;

    3. GetVentaByDates(dt1,dt2).ToList() y GetDetalleVentaByIdVenta(item.Id) son las consultas a la base de datos, la segunda Regresa una lista, pero ya no se como mostrar los detalles de venta en una clase llamada MostrarVenta que tiene las siguientes propiedades 

     public class MostrarVenta
        {
            public int Id { get; set; }
            public string TipoVenta { get; set; }
            public string NoTicket { get; set; }
            public string Cliente { get; set; }
            public DateTime FechaVenta { get; set; }
            public decimal Total { get; set; }
            public string Estado { get; set; }
            public decimal Descuento { get; set; }
            //public decimal IVA { get; set; }
            public decimal PU{get;set;}
            public decimal Subtotal { get; set; }
            public int Cantidad_Articulos { get; set; }
    
        }

    4. Sobre todo en la prop Cantidad de Articulos sume todas las cantidades que tiene cada detalle venta, pienso en el foreach, pero no se como sumalar...

    Saludos y Gracias


    • Editado Rafiñña martes, 19 de mayo de 2015 16:57
    • Cambiado Karen Malagón miércoles, 27 de mayo de 2015 22:05 LINQ issue
    martes, 19 de mayo de 2015 16:54

Todas las respuestas

  • hola

    pero no te convendria definir en GetVentaByDates() un parametro opcional del tipo "incluirDetalle"  del tipo bool y si se asigna a true entonces cargar informacion adicional

    a donde apunto es que no armas la entidad de a pedazos sino que GetVentaByDates() deberia devolver la entidad compuesta que permita navegar o sea la ventas y sus detalles para esos usas el Include() de linq

    Loading Related Entities

    el objeto venta y sus detalles se devuelve en una sola operacion

    depsues si necesitas usas nuevamente linq para convertir esto en MostrarVenta, pero la llamada al repository deberias ser una sola

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 19 de mayo de 2015 17:53
  • Hola Leandro, disculpa ya lo resolví de esta forma, 

    public List<MostrarVenta> ObtenerVentaParaReporteVentas(DateTime dt1,DateTime dt2)
            {
                List<MostrarVenta> lmv = new List<MostrarVenta>();
                List<Venta> lv = rcr.GetVentaByDates(dt1,dt2).ToList();
                foreach (Venta item in lv)
                {
                    List< DetalleVenta> dv = rcr.GetDetalleVentaByIdVenta(item.Id).ToList();
                    MostrarVenta mv = new MostrarVenta
                    {
                        Id = item.Id,
                        Cliente = string.Format("{0} {1}", item.Cliente.Persona.Nombre, item.Cliente.Persona.ApellidoPat),
                        NoTicket = item.NoNota,
                        FechaVenta = Convert.ToDateTime(item.FechaHoraVenta),
                        Total = item.Total,
                        TipoVenta = item.Tipo,
                        Descuento = Convert.ToDecimal(item.Descuento),
                    };
                    if (dv!=null)
                    {
                        foreach (DetalleVenta articulo in dv)
                        {
                            mv.Cantidad_Articulos = dv.Sum(c => c.Cantidad);
                            mv.Subtotal = dv.Sum(c => c.SubTotal);
                            mv.IVA = articulo.Venta.Total - dv.Sum(c => c.SubTotal);
                        }
    
                    }
                    lmv.Add(mv);
                }
                return lmv;
            }
    Ojala me pueda dar sus observaciones !!!

    miércoles, 20 de mayo de 2015 1:48
  • pero alli sigues realizando una consulta GetVentaByDates() para recuperar las ventas

    y luego iteras cada venta para recuperar el detalle con GetDetalleVentaByIdVenta()

    esa es una pesima implementacion, debes recuperar venta y detalles en una sola operacion, por eso se usa el Include() de linq

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 20 de mayo de 2015 5:03
  • Amm tiene razón tratare de limpiar mas la consulta, hasta ahorita he intentado realizar el include, pero al parecer es porque utilizo una expresion con from, ya que no me lo muestra 
    miércoles, 20 de mayo de 2015 5:23