C#Linq分组

C#Linq分组

C# Linq Grouping

我正在使用Linq进行实验,但无法确定分组。 我已经看过一些教程,但是由于某种原因无法弄清楚。

例如,假设我有一个带有多个网站ID的表(SiteStats),该表存储过去30天按类型访问了每个网站的访问者总数。

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

在SQL中,我可以使用以下命令轻松获取SiteID 1的计数:

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

并应该像...

1
2
3
4
5
╔════════╦════════════╗
║ SiteId ║ Last30Total║
╠════════╬════════════╣
║      1 ║         50
╚════════╩════════════╝

但是我不确定如何使用Linq获得此结果。 我试过了:

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

但我无法使用statsRecord.Last30之类的东西来取回总数

有人可以让我知道我要去哪里了吗? 任何帮助表示赞赏。


实际上,尽管Thomas的代码可以工作,但是使用lambda表达式更为简洁:

1
2
3
4
5
6
7
8
var totals =
from s in sites
group s by s.SiteID into grouped
select new
{
    SiteID = grouped.Key,
    Last30Sum = grouped.Sum( s => s.Last30 )
};

它使用Sum扩展方法,而无需嵌套的LINQ操作。

按照LINQ 101示例-http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped


我最容易说明的方法是使用内存中的对象,这样就可以清楚地了解正在发生的事情。 LINQ to SQL应该能够接受相同的LINQ查询并将其转换为适当的SQL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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; }
}

推荐阅读

    linux命令详细教程?

    linux命令详细教程?,系统,命令,代码,位置,工作,信息,数据,网址,地址,选项,Lin

    linux访问网站的命令?

    linux访问网站的命令?,地址,系统,服务,工作,网站,命令,网络,管理,信息,网址,L

    linux命令引入教程?

    linux命令引入教程?,基础,基础知识,工作,电脑,地址,命令,在线,发行,系统,概

    查看linux库类型命令?

    查看linux库类型命令?,系统,工作,信息,状态,电脑,命令,工具,代码,地址,发行,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux网卡类型命令?

    linux网卡类型命令?,网络,系统,地址,信息,设备,状态,服务,名称,名字,网卡,如

    linux时间命令教程?

    linux时间命令教程?,时间,系统,信息,国家,电脑,大陆,标准,中国,命令,终端,LIN

    linux命令工具教程?

    linux命令工具教程?,系统,工具,信息,基础,基础知识,代码,在线,地址,项目,服

    linux命令行登陆网站?

    linux命令行登陆网站?,网站,系统,密码,服务,地址,环境,网络,软件,状态,项目,

    linux进阶命令教程?

    linux进阶命令教程?,系统,设备,软件,网络,代码,基础,资料,概念,工具,环境,浅

    linux命令行端教程?

    linux命令行端教程?,系统,工具,基础,基础知识,终端,地址,信息,概念,在线,综

    linux查看命令类型用?

    linux查看命令类型用?,信息,系统,情况,命令,实时,工作,设备,电脑,文件,类型,

    linux进行分组的命令?

    linux进行分组的命令?,管理,情况,信息,系统,命令,通用,图片,密码,环境,单位,

    linux登陆网站命令?

    linux登陆网站命令?,网络,工具,网站,标准,地址,软件,系统,命令,数据,环境,lin

    linux命令三种类型?

    linux命令三种类型?,工作,地址,系统,标准,时间,管理,命令,目录,信息,文件,lin

    linux命令打开网站?

    linux命令打开网站?,网络,网站,系统,地址,密码,传播,工具,代码,环境,命令,大

    linux命令入门教程?

    linux命令入门教程?,基础,网络,管理,系统,第一,基础知识,服务,命令,软件,工

    linux简化命令教程?

    linux简化命令教程?,地址,工作,系统,信息,命令,目录,代码,标准,控制台,文件,L

    linux命令行登录网站?

    linux命令行登录网站?,系统,网站,地址,工作,软件,密码,网络,第一,环境,中心,

    linux命令行新手教程?

    linux命令行新手教程?,系统,基础,管理,基础知识,天通,概念,发行,环境,技术,