Principales respuestas
Transformacion de una consulta sql a LINQ

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!!!
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
-
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
-
>>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
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
-
-
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
-
>>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
-
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 };
-
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.
- Propuesto como respuesta Juan MondragónModerator martes, 14 de noviembre de 2017 22:22