Frage
Ich experimentiere mit Linq und habe Probleme, die Gruppierung herauszufinden.Ich habe mehrere Tutorials durchgesehen, komme aber aus irgendeinem Grund nicht dahinter.
Angenommen, ich habe eine Tabelle (SiteStats) mit mehreren Website-IDs, in der die Anzahl der Besucher nach Typ gespeichert wird, die insgesamt und in den letzten 30 Tagen auf jede Website zugegriffen haben.
╔════════╦═════════════╦════════╦══════╗
║ SiteId ║ VisitorType ║ Last30 ║ Total║
╠════════╬═════════════╬════════╬══════╣
║ 1 ║ 1 ║ 10 ║ 100 ║
║ 1 ║ 2 ║ 40 ║ 140 ║
║ 2 ║ 1 ║ 20 ║ 180 ║
╚════════╩═════════════╩════════╩══════╝
In SQL kann ich die Anzahl für SiteID 1 leicht wie folgt ermitteln:
SELECT SiteId,
SUM(Last30) AS Last30Sum
FROM Sites
WHERE SiteId = 1
GROUP BY SiteId
und sollte eine Reihe wie ... bekommen
╔════════╦════════════╗
║ SiteId ║ Last30Total║
╠════════╬════════════╣
║ 1 ║ 50 ║
╚════════╩════════════╝
Ich bin mir jedoch nicht sicher, wie ich dieses Ergebnis mit Linq erzielen kann.Ich habe es versucht:
var statsRecord = from ss in db.SiteStats
where ss.SiteId == siteId
group ss by ss.SiteId into ss
select ss;
aber mit so etwas schaffe ich es nicht, den Gesamtbetrag zurückzubekommen statsRecord.Last30
Kann mir bitte jemand sagen, wo ich falsch liege?Jede Hilfe wird geschätzt.
Lösung
Obwohl der Code von Thomas funktionieren wird, ist es tatsächlich prägnanter, einen Lambda-Ausdruck zu verwenden:
var totals =
from s in sites
group s by s.SiteID into grouped
select new
{
SiteID = grouped.Key,
Last30Sum = grouped.Sum( s => s.Last30 )
};
die die Sum-Erweiterungsmethode verwendet, ohne dass eine verschachtelte LINQ-Operation erforderlich ist.
gemäß den LINQ 101-Beispielen - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped
Andere Tipps
Der einfachste Weg, dies zu veranschaulichen, ist für mich die Verwendung von In-Memory-Objekten, damit klar ist, was passiert.LINQ to SQL sollte in der Lage sein, dieselbe LINQ-Abfrage zu übernehmen und in entsprechendes SQL zu übersetzen.
public class Site
{
static void Main()
{
List<Site> sites = new List<Site>()
{
new Site() { SiteID = 1, VisitorType = 1, Last30 = 10, Total = 100, },
new Site() { SiteID = 1, VisitorType = 2, Last30 = 40, Total = 140, },
new Site() { SiteID = 2, VisitorType = 1, Last30 = 20, Total = 180, },
};
var totals =
from s in sites
group s by s.SiteID into grouped
select new
{
SiteID = grouped.Key,
Last30Sum =
(from value in grouped
select value.Last30).Sum(),
};
foreach (var total in totals)
{
Console.WriteLine("Site: {0}, Last30Sum: {1}", total.SiteID, total.Last30Sum);
}
}
public int SiteID { get; set; }
public int VisitorType { get; set; }
public int Last30 { get; set; }
public int Total { get; set; }
}