18

私は Linq を試していますが、グループ化を理解するのに苦労しています。いくつかのチュートリアルを実行しましたが、何らかの理由でこれを理解できません。

例として、複数の Web サイト ID を持つテーブル (SiteStats) があるとします。このテーブルには、過去 30 日間に各サイトにアクセスした訪問者の総数がタイプ別に格納されています。

╔════════╦═════════════╦════════╦══════╗
║ SiteId ║ VisitorType ║ Last30 ║ Total║
╠════════╬═════════════╬════════╬══════╣
║      1 ║           1 ║     10 ║  100 ║
║      1 ║           2 ║     40 ║  140 ║
║      2 ║           1 ║     20 ║  180 ║
╚════════╩═════════════╩════════╩══════╝

SQL では、次のように SiteID 1 のカウントを簡単に取得できます。

SELECT SiteId,  
       SUM(Last30) AS Last30Sum  
FROM Sites  
WHERE SiteId = 1  
GROUP BY SiteId

そして、次のような行を取得する必要があります...

╔════════╦════════════╗
║ SiteId ║ Last30Total║
╠════════╬════════════╣
║      1 ║         50 ║
╚════════╩════════════╝

ただし、Linq を使用してこの結果を取得する方法がわかりません。私はもう試した:

var statsRecord = from ss in db.SiteStats  
    where ss.SiteId == siteId  
    group ss by ss.SiteId into ss  
    select ss;

しかし、次のようなもので合計を取り戻すことはできませんstatsRecord.Last30

誰かが私が間違っているところを教えてもらえますか? どんな助けでも大歓迎です。

4

2 に答える 2

34

実際、Thomas のコードは機能しますが、ラムダ式を使用する方がより簡潔です。

var totals =
from s in sites
group s by s.SiteID into grouped
select new
{
    SiteID = grouped.Key,
    Last30Sum = grouped.Sum( s => s.Last30 )
};

これは、ネストされた LINQ 操作を必要とせずに Sum 拡張メソッドを使用します。

LINQ 101 の例に従って - http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped

于 2008-08-31T07:40:23.437 に答える
4

私が説明する最も簡単な方法は、メモリ内オブジェクトを使用することです。これにより、何が起こっているのかが明確になります。LINQ to SQL は、同じ LINQ クエリを取得して、適切な SQL に変換できる必要があります。

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; }
}
于 2008-08-29T18:27:29.060 に答える