Jak mogę grupować wynik zapytania LINQ do zapytania SQL przez godziny, biorąc pod uwagę, że typem kolumny jest DateTime?LINQ do SQL - Grupowanie według godzin
11
A
Odpowiedz
23
Oto rozwiązanie dla godzin technicznych (bezkontekstowych).
var query = myDC.Orders
.GroupBy(x => x.OrderDate.Hour)
.Select(g => new {
Hour = g.Key,
Amount = g.Sum(x => x.OrderAmount)
});
który generuje to:
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]
Oto rozwiązanie dla godzinach pracy (context-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});
który generuje to:
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]
Fuj - że bigint/pływak/milisekundy rzeczy jest brzydkie i trudne do zweryfikowania. Wolę robić dodawanie z powrotem po stronie klienta:
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});
który generuje to:
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]
A oto trzeci sposób robi contextful godzin. Ten jest bardzo przyjazny dla C#, ale w bazie danych jest logika łańcuchowa (fuj).
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) });
który generuje
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]
Powiązane problemy
- 1. Grupowanie według godziny przy użyciu LINQ
- 2. Grupowanie za pomocą LINQ
- 3. Grupowanie według zakresu dat w T-SQL
- 4. Grupowanie wielopoziomowe w LINQ?
- 5. Grupowanie "inteligentne" z LINQ
- 6. Grupowanie według dni Created_At
- 7. Grupowanie elementów według klucza?
- 8. Słownik "Grupowanie" według wartości
- 9. Grupowanie danych LINQ Dwukrotnie
- 10. Grupowanie SQL według datetime z maksymalną różnicą x minut
- 11. Grupowanie według roku obrachunkowego (Oracle)
- 12. T-SQL: Sortowanie według daty, a następnie grupowanie?
- 13. Grupowanie SQL/Wartość kontraktowa
- 14. dane grupowanie SQL Server
- 15. SQL grupowanie wokół szczelin
- 16. Sygnały w Linq do Sql?
- 17. Błąd LINQ do SQL ForeignKeyReferenceAlreadyHasValueException
- 18. LINQ do SQL PredicateBuilder
- 19. LINQ do SQL Paging
- 20. Linq Do grupy SQL By and Sum
- 21. Grupowanie danych w tygodniowe, miesięczne według użytkownika
- 22. Grupowanie według tygodnia/miesiąca/etc i ActiveRecord?
- 23. Grupowanie najgoretyczniejszych testów jednostkowych według kategorii
- 24. Dynamiczne grupowanie według określonych atrybutów z Collection.stream
- 25. Konwertuj 12 godzin znaków do 24 godzin
- 26. Umożliwia grupowanie wielowymiarowej tablicy według określonej wartości?
- 27. grupowanie według wielu kluczy w Clojure
- 28. Uzyskaj zapytanie SQL z LINQ do SQL?
- 29. Zagnieżdżona grupa według LINQ
- 30. Użyj Linq do sumowania według indeksu