Linq - Gruppierung nach Datum und Auswahl der Anzahl
Ich arbeite derzeit durch ein problem, ich möchte eine Abfrage ausführen, die Gruppen die Ergebnisse durch das gewählte Datum.
Für dieses Beispiel, stellen Sie sich ein einfaches Modell, etwa so:
public class User
{
public DateTime LastLogIn {get; set;}
public string Name {get; set;}
}
Die Lösung, die ich Suche, ist um die Anzahl der Benutzer angemeldet Date.
In der Datenbank DateTime gespeichert werden mit Datum und Uhrzeit-Komponenten, aber für diese Abfrage, die ich wirklich nur die Sorge um das Datum.
Was ich derzeit habe, ist dies:
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)EntityFunctions.TruncateTime(x.Key)
}).ToList();
Oben jedoch gibt eine leere Liste zurück.
End-Ziel ist es, eine Liste von Objekten, die einen Wert enthalten (die Anzahl von angemeldeten Benutzern an einem Tag) und ein Tag (der Tag in Frage)
Irgendwelche Gedanken?
Beim ändern der Abfrage:
context.Users
.Where((x.LastLogIn >= lastWeek)
&& (x.LastLogIn <= DateTime.Now))
.GroupBy(x => EntityFunctions.TruncateTime(x.LastLogIn))
.Select(x => new
{
Value = x.Count(),
Day = (DateTime)x.Key
}).ToList();
es gibt jetzt eine Liste mit einem einzigen Element, wobei der Wert der Gesamtanzahl der Benutzer, die mit der where-Klausel und den Tag als ersten Tag. Es ist immer noch nicht schien in der Lage sein, um die Gruppe durch die Tage
HINWEIS: stellt sich heraus der oben gezeigte code ist Recht, ich war gerade etwas anderes falsch.
Sql, die es generiert wird (Hinweis möglicherweise sehr leichte syntaktische Fehler hier bei mir, die Anpassung für das Beispiel):
SELECT
1 AS [C1],
[GroupBy1].[A1] AS [C2],
CAST( [GroupBy1].[K1] AS datetime2) AS [C3]
FROM ( SELECT
[Filter1].[K1] AS [K1],
COUNT([Filter1].[A1]) AS [A1]
FROM ( SELECT
convert (datetime2, convert(varchar(255), [Extent1].[LastLogIn], 102) , 102) AS [K1],
1 AS [A1]
FROM [dbo].[Users] AS [Extent1]
WHERE (([Extent1].[LastLogIn] >= @p__linq__1) AND ([Extent1].[LastLogIn] <= @p__linq__2)
) AS [Filter1]
GROUP BY [K1]
) AS [GroupBy1]
GroupBy
mit einer geraden Count()
? Tag = (DateTime)EntityFunctions.TruncateTime(x.Key)
mit Tag = x.Key
? Es sollten die gleichen sein, weil das Datum ist schon gekürzt, die für die Gruppierung. InformationsquelleAutor der Frage Thewads | 2013-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nicht den zweiten
TruncateTime
:Den
GroupBy
hat abgeschnitten, die Zeit von derDateTime
schon, so brauchen Sie nicht, rufen Sie es erneut.Verwenden
EntityFunctions.TruncateTime
müssen Sie auf die assembly verweisenSystem.Data.Entity
und dannusing System.Data.Objects;
InformationsquelleAutor der Antwort dasblinkenlight
Versuchen Sie dies:
InformationsquelleAutor der Antwort AD.Net
Können Sie es leicht tun:
InformationsquelleAutor der Antwort Seyyed Puya Soofbaf
Kann man es auch in einer Zeile.
InformationsquelleAutor der Antwort Yahiya Iqbal