3

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

<开始详细>

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

string EventName;
Datetime WhenItHappend;

我们想要生成一个像下面的示例一样的报告,其中我们按 EventName 分组,然后有一系列列来计算一些日期和时间框架计数。困难显然是可变数量的列。

  Sport   Jan 2010Jan 2009Feb 2010Feb 2009
Basketball    26      18      23      16  
Hockey        28      19      25      18  
Swimming      52      45      48      43  

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

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

<结束开始详细>

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

4

1 回答 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 } );

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

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

于 2010-03-08T23:00:07.263 回答