首页 文章

Linq:如何将行转换为带有计数的列(交叉表数据)?

提问于
浏览
3

我想我需要一种使用C#和Linq执行数据透视表或交叉表的方法,列数不确定 . 但是,我将添加一些开始细节以查看它的去向 .

<开始细节>

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

string EventName;
Datetime WhenItHappend;

我们想生成一个报告,如下面的示例,我们按EventName进行分组,然后有一系列列来计算某些日期和时间帧数 . 困难显然是可变数量的列 .

SportJan 2010Jan 2009Feb 2010Feb 2009
Basketball26182316
Hockey28192518
Swimming52454843

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

Any way to assemble this as a single linq IQueryable result in C#?

<结束开始细节>

就SQL而言,我尝试创建一个日期范围表{TimeFrameName,begin,end}并将其连接到上面的表,其中begin <= whenItHappened和whenItHappened <= end,这产生了一组很好的{EventName,TimeFrameName}然后做了一个计数(*),但仍然留下了如何转换数据,使行成为列 .

1 回答

  • 2

    你有一个类/ 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 } );
    

    现在你基本上有一个2维的集合数组 . 您可以在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匹配的原始列表的子集 . 如果指定2维键,则可以将结果视为2维集合数组 .

    GroupBy是一个非常强大的运营商!

相关问题