【问题标题】:C# Linq GroupingC# Linq 分组
【发布时间】:2010-09-07 06:54:24
【问题描述】:

我正在试验 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 之类的东西取回总数

有人可以告诉我哪里出错了吗?任何帮助表示赞赏。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    实际上,虽然 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

    【讨论】:

    • 虽然 OP 没有问,但你能告诉我们如何用 LINQ 的方法语法编写它吗?
    【解决方案2】:

    对我来说,最简单的说明方法是使用内存中的对象,这样就很清楚发生了什么。 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多