[英]C# Linq Grouping
我正在试验Linq并且无法搞清楚分组。 我已经完成了几个教程,但由于某种原因无法弄清楚这一点。
例如,假设我有一个包含多个网站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
东西statsRecord.Last30
有人可以让我知道我哪里错了吗? 任何帮助表示赞赏。
实际上,虽然Thomas的代码可以工作,但使用lambda表达式更为简洁:
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。
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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.