¿Cómo puedo agrupar el resultado de una consulta de LINQ a SQL por horas teniendo en cuenta que el tipo de columna es DateTime?LINQ to SQL - Agrupación por horas
11
A
Respuesta
23
Aquí hay una solución para horas técnicas (sin contexto).
var query = myDC.Orders
.GroupBy(x => x.OrderDate.Hour)
.Select(g => new {
Hour = g.Key,
Amount = g.Sum(x => x.OrderAmount)
});
que genera esto:
SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hour]
FROM (
SELECT DATEPART(Hour, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
FROM [dbo].[Orders] AS [t0]
) AS [t1]
GROUP BY [t1].[value]
Aquí es una solución para el horario comercial (de contexto-ful).
DateTime zeroDate = new DateTime(2008, 1, 1);
var query = myDC.Orders
.GroupBy(x => System.Data.Linq.SqlClient.SqlMethods.DateDiffHour(zeroDate, x.OrderDate)
)
.Select(g => new { Hours = g.Key, Amount = g.Sum(x => x.OrderAmount) })
.Select(x => new { Hour = zeroDate.AddHours(x.Hours), Amount = x.Amount});
que genera esto:
SELECT DATEADD(ms, (CONVERT(BigInt,(CONVERT(Float,[t2].[value2])) * 3600000)) % 86400000, DATEADD(day, (CONVERT(BigInt,(CONVERT(Float,[t2].[value2])) * 3600000))/86400000, @p1)) AS [Hour], [t2].[value] AS [Amount]
FROM (
SELECT SUM([t1].[OrderAmount]) AS [value], [t1].[value] AS [value2]
FROM (
SELECT DATEDIFF(Hour, @p0, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
FROM [dbo].[Orders] AS [t0]
) AS [t1]
GROUP BY [t1].[value]
) AS [t2]
Uf - que bigint/flotador/milisegundos cosas son feas y difíciles de verificar. Yo prefiero hacer la adición de nuevo en el lado del cliente:
var results = myDC.Orders
.GroupBy(x => System.Data.Linq.SqlClient.SqlMethods.DateDiffHour(zeroDate, x.OrderDate)
)
.Select(g => new { Hours = g.Key, Amount = g.Sum(x => x.OrderAmount) })
.ToList()
.Select(x => new { Hour = zeroDate.AddHours(x.Hours), Amount = x.Amount});
que genera esto:
SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hours]
FROM (
SELECT DATEDIFF(Hour, @p0, [t0].[OrderDate]) AS [value], [t0].[OrderAmount]
FROM [dbo].[Orders] AS [t0]
) AS [t1]
GROUP BY [t1].[value]
Y aquí está una tercera forma de hacer las horas contextful. Este es muy C# amistoso, pero hay una lógica de cadena en la base de datos (yuck).
var query = myDC.Orders
.GroupBy(x => new DateTime(x.OrderDate.Year, x.OrderDate.Month, x.OrderDate.Day, x.OrderDate.Hour, 0, 0))
.Select(g => new { Hour = g.Key, Amount = g.Sum(x => x.OrderAmount) });
que genera
SELECT SUM([t1].[OrderAmount]) AS [Amount], [t1].[value] AS [Hour]
FROM (
SELECT CONVERT(DATETIME, (CONVERT(NCHAR(4), DATEPART(Year, [t0].[OrderDate])) + ('-' + (CONVERT(NCHAR(2), DATEPART(Month, [t0].[OrderDate])) + ('-' + CONVERT(NCHAR(2), DATEPART(Day, [t0].[OrderDate])))))) + (' ' + (CONVERT(NCHAR(2), DATEPART(Hour, [t0].[OrderDate])) + (':' + (CONVERT(NCHAR(2), @p0) + (':' + CONVERT(NCHAR(2), @p1)))))), 120) AS [value], [t0].[OrderAmount]
FROM [dbo].[Orders] AS [t0]
) AS [t1]
GROUP BY [t1].[value]
Cuestiones relacionadas
- 1. Linq-to-SQL y sp_reset_connection
- 2. LINQ to SQL PredicateBuilder
- 3. LINQ to SQL Peculiarities
- 4. LINQ to SQL -
- 5. Herramienta SQL to LINQ
- 6. Linq-to-SQL ToDictionary()
- 7. LINQ To SQL Paging
- 8. Linq to SQL Group By y Suma
- 9. Entity Framework vs Linq to Entities vs Linq to SQL
- 10. LINQ to SQL valores predeterminados
- 11. LINQ to SQL Conversion Overflows
- 12. LINQ to SQL OrdenarPor thenby
- 13. ¿Qué es "Linq to SQL"?
- 14. LINQ to SQL e inmutabilidad
- 15. linq to sql update standard
- 16. LINQ to SQL ForeignKeyReferenceAlreadyHasValueException error
- 17. ¿Está desaprobado LINQ to SQL?
- 18. Linq to SQL create table
- 19. Error LINQ to SQL Designer
- 20. Actualizar usando LINQ to SQL
- 21. LINQ to SQL SOUNDEX - posible?
- 22. LINQ to SQL para Oracle.ODP
- 23. LINQ To SQL Dynamic Select
- 24. NHibernate vs LINQ to SQL
- 25. LINQ to SQL vs ADO.Net
- 26. Optimizar consultas LINQ-to-SQL
- 27. Agrupación usando LINQ
- 28. Cuál es la diferencia entre "LINQ to Entities", "LINQ to SQL" y "LINQ to Dataset"
- 29. ¿Cómo evita LINQ-To-SQL Inyecciones SQL?
- 30. T-SQL IsNumeric() y Linq-to-SQL