【问题标题】:Linq: How to transform rows to columns with a count (Crosstab data)?Linq:如何将行转换为具有计数的列(交叉表数据)?
【发布时间】:2010-03-09 07:00:07
【问题描述】:

我认为我需要一种方法来使用 C# 和 Linq 执行具有不确定列数的数据透视表或交叉表。不过,我会添加一些开始的细节来看看它的去向。

想象一个有两个字段的表格:

string EventName;
Datetime WhenItHappend;

我们想要生成一个类似于下面示例的报告,其中我们按 EventName 分组,然后有一系列列来计算某些日期和时间范围计数。难点显然是列数不定。

  运动   2010 年 1 月2009 年 1 月2010 年 2 月2009 年 2 月
篮球    26      18      23      16  
曲棍球        28      19      25      18  
游泳      52   kbd>    45      48      43  

客户可以为报告创建任意数量的命名事件计数器。函数始终相同:“名称”、“开始”、“结束”。

有什么方法可以在 C# 中将其组装为单个 linq IQueryable 结果?

就 SQL 而言,我尝试创建一个日期范围表 {TimeFrameName, begin, end} 并将其连接到上面的表中 begin

【问题讨论】:

    标签: c# linq crosstab


    【解决方案1】:

    你有一个类/SQL 行

    class Thing
    {
        public string EventName;
        public DateTime WhenItHappend;
    }
    

    你想按 EventName 和 WhenItHappened.Month 分组

    // make a collection and add some Things to it
    var list = new List<Thing>();
    list.Add(new Thing(){ .... });
    // etc
    
    var groups = list.GroupBy(t => new { t.WhenItHappend.Month, t.EventName } );
    

    现在您基本上拥有了一个二维集合数组。您可以在 Month / EventName 上遍历这些以获取每个集合中项目的计数,这是您希望在表中显示的内容。

    foreach (var row in groups.GroupBy(g => g.Key.EventName))
    {
        foreach (var month in row.GroupBy(g => g.Key.Month))
        {
            var value = month.Count();
        }
    }
    

    GroupBy 运算符返回一组组,其中每个组包含一个 Key 和与指定 Key 匹配的原始列表的子集。如果指定二维 Key,则可以将结果视为二维集合数组。

    GroupBy 是一个非常强大的运算符!

    【讨论】:

    • 很酷。我喜欢嵌套计算器。所以我认为客户选择的每个命名时间框架都是一个单独的集合,就像您在上面的“组”中一样,然后根据 EventName 将集合连接在一起?
    • 我可能会收集日期范围,然后按 EventName 和适当的日期范围进行分组。即 dateRanges.Where(d => d.StartDate t.WhenItHappened)。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2020-10-07
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多