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.

War es hilfreich?

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; }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top