Come posso raggruppare il risultato di una query LINQ su SQL per ore considerando che il tipo di colonna è DateTime?LINQ to SQL - Raggruppamento per ore
11
A
risposta
23
Ecco una soluzione per l'orario tecnico (senza contesto).
var query = myDC.Orders
.GroupBy(x => x.OrderDate.Hour)
.Select(g => new {
Hour = g.Key,
Amount = g.Sum(x => x.OrderAmount)
});
che genera questo:
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]
Ecco una soluzione per l'orario di lavoro (al contesto 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});
che genera questo:
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]
Ugh - che bigint/galleggiante/millisecondi roba è brutto e difficile da verificare. Io preferisco fare l'aggiunta di nuovo sul lato client:
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});
che genera questo:
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]
Ed ecco un terzo modo di fare le ore contextful. Questo è molto amichevole con C#, ma c'è una logica di stringa nel database (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) });
che 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]
Problemi correlati
- 1. LINQ to SQL per Oracle.ODP
- 2. Convert SQL per LINQ to SQL
- 3. Timeout Linq-to-SQL
- 4. LINQ to SQL -
- 5. Linq - Raggruppamento per più tabelle
- 6. Visualizzatore LINQ to SQL per VS 2010?
- 7. Traduci istruzione LINQ to sql
- 8. NOLOCK con Linq to SQL
- 9. Linq-to-SQL e sp_reset_connection
- 10. ObjectTrackingEnabled e linq-to-sql
- 11. Linq to SQL e Avere
- 12. LINQ to SQL e immutabilità
- 13. LINQ to SQL ForeignKeyReferenceAlreadyHasValueException error
- 14. LINQ to SQL batch cancellare
- 15. LINQ to SQL decimale Parametro
- 16. LINQ to SQL: risoluzione Concurrency
- 17. Che cos'è "Linq to SQL"?
- 18. LINQ to SQL - aggiornamento record
- 19. Linq To Sql con PostgreSQL
- 20. Raggruppamento utilizzando LINQ
- 21. LINQ to SQL con SQL Azure
- 22. log LINQ to SQL generato SQL per NLog
- 23. Raggruppamento per ora utilizzando LINQ
- 24. Linq to Sql - Molti a molti - CRUD
- 25. Aggiornamento cumulativo con LINQ to SQL
- 26. Linq to SQL e modello DB grande
- 27. Elenco e Linq To Sql Performance Numero
- 28. LINQ to SQL .sum() senza ... in
- 29. DataContext Linq-to-SQL su più thread
- 30. Non come in LINQ to SQL