C#Linq分组
时间:2020-03-05 18:45:07 来源:igfitidea点击:
我正在使用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
之类的东西来取回总数
有人可以让我知道我要去哪里了吗?任何帮助表示赞赏。
解决方案
回答
我最容易说明的方法是使用内存中的对象,这样就可以清楚地知道发生了什么。 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; } }
回答
实际上,尽管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