none
Transformacion de una consulta sql a LINQ RRS feed

  • Pregunta

  • Hola quisiera que me ayudaran con varias dudas, primero como se pasan parametros a LINQ lo que hice es que la funcion que me ejecuta la query reciba como parametros mis valores que mando como parametro en la consulta SQL y la mando en el where en la consulta LINQ,

    aqui esta la consulta SQL

    SELECT movimientos.fechaMov AS 
    Fecha,COUNT(articulo.lote_articulo) AS Cantidad, 
    articulo.nombre_articulo AS Articulo, 
    articulo.modelo_articulo AS Modelo, 
    articulo.tamaño_articulo AS Tamaño, 
    articulo.color_articulo AS Color, 
    movimientos.tipoMov as Movimiento, 
    articulo.lote_articulo as Lote 
    FROM articulo INNER JOIN movimientos 
    ON articulo.codbar_articulo = movimientos.codbarMov 
    WHERE movimientos.fechaMov 
    BETWEEN @desde AND @hasta 
    GROUP BY movimientos.fechaMov, 
    articulo.lote_articulo, movimientos.tipoMov 
    ORDER BY movimientos.fechaMov, movimientos.tipoMov

    y asi llevo la consulta LINQ, aqui la otra duda es como agrego la funcion cont en linq y asi 

    using (ContextDB.ContextDB obj =new ContextDB.ContextDB())
                {
                    var query = from m in obj.Movimientos
                                join a in obj.Articulos
                                on m.CodBarMov equals a.CodBarArtiulo
                                where m.FechaMov<=hasta
                                where m.FechaMov>=desde
                                orderby m.FechaMov
                                select new
                                {
                                    m.FechaMov,
                                    a.NombreArticulo,
                                    a.ModeloArticulo,
                                    a.TamañoArticulo,
                                    a.ColorArticulo,
                                    a.LoteArticulo,
                                    m.TipoMov
                                };
                    var num = query.Select(a => a.LoteArticulo).Count();
                }

    entonces quisiera saber que tan bien o que tan mal estoy... con eso de pasar las fechas y lo del campo count de SQL como se pasa a LINQ

    Gracias!!!

    martes, 14 de noviembre de 2017 17:41

Respuestas

  • hola

    >>como se pasan parametros a LINQ lo que hice es que la funcion que me ejecuta la query reciba como parametros mis valores que mando como parametro en la consulta SQL y la mando en el where en la consulta LINQ,

    es correcto

    los filtros en el query linq los asignes directo en el where

    >>que tan bien o que tan mal estoy... con eso de pasar las fechas

    es correcto como lo asignas

    >>lo del campo count de SQL como se pasa a LINQ

    para que armas todo un query que defiens un select , si despues vas a utilizar solo un campo ?

    el count cuenta la cantidad de campos, no necesitas definir un select, pdodria solo ser

    using (ContextDB.ContextDB obj =new ContextDB.ContextDB())
    {
    	var num = query.Where(m => m.FechaMov<=hasta && m.FechaMov>=desde).Count();
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Jorge TurradoMVP martes, 14 de noviembre de 2017 18:12
    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 17:55
  • La consulta t-sql que adjuntas es incorrecta porque muestras, en la lista de selección, columnas que no forman parte del criterio de agrupación ni de una función de agregado.

    - Consulta sql

    SELECT 
        a.lote_articulo AS Lote,
        m.fechaMov AS Fecha,
        m.tipoMov AS Movimiento,
        COUNT(*) AS Cantidad    
    FROM 
        articulo a
        INNER JOIN movimientos m ON a.codbar_articulo = m.codbarMov
    WHERE m.fechaMov BETWEEN @desde AND @hasta
    GROUP BY a.lote_articulo, m.fechaMov, m.tipoMov
    ORDER BY m.fechaMov;
    GO


    - Consulta Linq

    using (ContextDB.ContextDB obj = new ContextDB.ContextDB())
    {
    	var query = (from a in obj.articulo
    				join m in obj.movimientos on a.codbar_articulo equals m.codbarMov
    				where m.FechaMov >= desde && m.FechaMov <= hasta
    				group a by new
    				{
    					Lote = a.lote_articulo,
    					Fecha = m.fechaMov,
    					Movimiento = m.tipoMov
    				} into g
    				select new
    				{
    					Lote = g.Key.Lote,
    					Fecha = g.Key.Fecha,
    					Movimiento = g.Key.Movimiento,
    					Cantidad = g.Count()
    				}).OrderBy(x => x.Fecha);
    }

    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 18:26
  • >>se me olvidaba un detalle, como le pones un encabezado 

    te refieres a un alias, en linq simplemente definis la propiedad

    select new { FechaMovimient = m.FechaMov, Nombre = a.NombreArticulo, Modelo = a.ModeloArticulo,

    .

    .

    >>la consulta de linq como la tengo hasta ahorta me deberia dar el mismo resultado

    no se, quizas

    la unica forma de validarlo es eejcutando y viendo que los datos que obtienes coincidan

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 18:34

Todas las respuestas

  • hola

    >>como se pasan parametros a LINQ lo que hice es que la funcion que me ejecuta la query reciba como parametros mis valores que mando como parametro en la consulta SQL y la mando en el where en la consulta LINQ,

    es correcto

    los filtros en el query linq los asignes directo en el where

    >>que tan bien o que tan mal estoy... con eso de pasar las fechas

    es correcto como lo asignas

    >>lo del campo count de SQL como se pasa a LINQ

    para que armas todo un query que defiens un select , si despues vas a utilizar solo un campo ?

    el count cuenta la cantidad de campos, no necesitas definir un select, pdodria solo ser

    using (ContextDB.ContextDB obj =new ContextDB.ContextDB())
    {
    	var num = query.Where(m => m.FechaMov<=hasta && m.FechaMov>=desde).Count();
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Jorge TurradoMVP martes, 14 de noviembre de 2017 18:12
    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 17:55
  • ok, entones la consulta de linq como la tengo hasta ahorta me deberia dar el mismo resultado... y se me olvidaba un detalle, como le pones un encabezado  

    por ejemplo en sql se pone asi...

    articulo.nombre_articulo AS Articulo, 

    como seria en linq

    martes, 14 de noviembre de 2017 18:24
  • La consulta t-sql que adjuntas es incorrecta porque muestras, en la lista de selección, columnas que no forman parte del criterio de agrupación ni de una función de agregado.

    - Consulta sql

    SELECT 
        a.lote_articulo AS Lote,
        m.fechaMov AS Fecha,
        m.tipoMov AS Movimiento,
        COUNT(*) AS Cantidad    
    FROM 
        articulo a
        INNER JOIN movimientos m ON a.codbar_articulo = m.codbarMov
    WHERE m.fechaMov BETWEEN @desde AND @hasta
    GROUP BY a.lote_articulo, m.fechaMov, m.tipoMov
    ORDER BY m.fechaMov;
    GO


    - Consulta Linq

    using (ContextDB.ContextDB obj = new ContextDB.ContextDB())
    {
    	var query = (from a in obj.articulo
    				join m in obj.movimientos on a.codbar_articulo equals m.codbarMov
    				where m.FechaMov >= desde && m.FechaMov <= hasta
    				group a by new
    				{
    					Lote = a.lote_articulo,
    					Fecha = m.fechaMov,
    					Movimiento = m.tipoMov
    				} into g
    				select new
    				{
    					Lote = g.Key.Lote,
    					Fecha = g.Key.Fecha,
    					Movimiento = g.Key.Movimiento,
    					Cantidad = g.Count()
    				}).OrderBy(x => x.Fecha);
    }

    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 18:26
  • >>se me olvidaba un detalle, como le pones un encabezado 

    te refieres a un alias, en linq simplemente definis la propiedad

    select new { FechaMovimient = m.FechaMov, Nombre = a.NombreArticulo, Modelo = a.ModeloArticulo,

    .

    .

    >>la consulta de linq como la tengo hasta ahorta me deberia dar el mismo resultado

    no se, quizas

    la unica forma de validarlo es eejcutando y viendo que los datos que obtienes coincidan

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Sully Ruiz martes, 14 de noviembre de 2017 18:41
    martes, 14 de noviembre de 2017 18:34
  • entonces la query con linq quedaria asi???

    using (ContextDB.ContextDB obj =new ContextDB.ContextDB())
                {
                    var query = from m in obj.Movimientos
                                join a in obj.Articulos
                                on m.CodBarMov equals a.CodBarArtiulo
                                where m.FechaMov <= hasta && m.FechaMov >= desde
                                group a by new
                                {
                                    Fecha = m.FechaMov,
                                    Articulo = a.NombreArticulo,
                                    Modelo = a.ModeloArticulo,
                                    Tamaño = a.TamañoArticulo,
                                    Color = a.ColorArticulo,
                                    Lote = a.LoteArticulo,
                                    Movimiento = m.TipoMov
                                } into g
                                select new
                                {
                                    Fecha=g.Key.Fecha,
                                    Cantidad=g.Count(),
                                    Articulo=g.Key.Articulo,
                                    Modelo=g.Key.Modelo,
                                    Tamaño=g.Key.Tamaño,
                                    Color=g.Key.Color,
                                    Lote = g.Key.Lote,
                                    Movimiento=g.Key.Movimiento
                                };

    martes, 14 de noviembre de 2017 18:52
  • Si, a simple vista es correcto. ¿Lo ejecutaste?, vamos, es una forma de saber si la consulta se resuelve sin errores de sintaxis o de datos. 

    martes, 14 de noviembre de 2017 19:07