Entity Framework: Effizient Gruppierung nach Monat
Ich habe getan, ein wenig Forschung auf dies, und die beste, die ich bisher gefunden habe, ist die Verwendung eines Asenumerable auf das gesamte dataset, so dass die Filterung erfolgt in linq to objects, anstatt auf die DB. Ich bin mit der neuesten EF.
Meine Arbeit (aber sehr langsam) code:
var trendData =
from d in ExpenseItemsViewableDirect.AsEnumerable()
group d by new {Period = d.Er_Approved_Date.Year.ToString() + "-" + d.Er_Approved_Date.Month.ToString("00") } into g
select new
{
Period = g.Key.Period,
Total = g.Sum(x => x.Item_Amount),
AveragePerTrans = Math.Round(g.Average(x => x.Item_Amount),2)
};
Dies gibt mir die Monate im format JJJJ-MM, zusammen mit dem Gesamtbetrag und Durchschnittlicher Betrag. Allerdings dauert es mehrere Minuten jedes mal.
Meine andere Problemumgehung ist, zu tun, eine update-Abfrage in SQL, also habe ich eine YYYYMM Feld Gruppe nativ durch. Ändern der DB ist nicht leicht zu beheben, aber so irgendwelche Vorschläge würden geschätzt.
Den thread fand ich den oben genannten code-Idee (http://stackoverflow.com/questions/1059737/group-by-weeks-in-linq-to-entities) erwähnt 'warten, bis .NET 4.0'. Ist es etwas, das vor kurzem eingeführt, dass hilft in dieser situation?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Grund für die schlechte Leistung ist, dass die gesamte Tabelle in den Speicher geholt (AsEnumerable()). Sie können die Gruppe dann nach Jahr und Monat wie diese
Bearbeiten
Die ursprüngliche Abfrage, aus meiner Antwort, war versuchen zu tun, eine Verkettung zwischen einem int und einem string, was nicht übersetzbar ist durch EF in SQL-Anweisungen. Ich könnte SqlFunctions Klasse, aber die Abfrage es wird ziemlich hässlich. Also ich habe AsEnumerable() nach der die Gruppierung vorgenommen wird, was bedeutet, dass EF führt die Gruppe Abfrage auf dem server, erhalten Sie Jahr, Monat, etc, aber der benutzerdefinierten Projektion erfolgt über Objekte (was folgt nach AsEnumerable()).
Wenn es um group by Monat, die ich lieber tun, diese Aufgabe in dieser Weise:
Da hält datetime-Typ in der Gruppierung ergeben.
Ähnlich zu dem, was cryss schrieb, mache ich die folgenden für die EF. Hinweis: wir verwenden EntityFunctions zu können, rufen alle DB-Anbieter unterstützt durch EF. SqlFunctions funktioniert nur für SQLServer.
Einen Vorgeschmack auf die generierte SQL (aus einem ähnlichen schema):