Linq:如何将行转换为带有计数的列(交叉表数据)?
我想我需要一种使用C#和Linq执行数据透视表或交叉表的方法,列数不确定。 但是,我会添加一些开始细节以了解它的去向。
想象一下有两个字段的表:
string EventName; Datetime WhenItHappend;
我们想生成一个报告,如下面的示例,我们按EventName进行分组,然后有一系列列来计算一些日期和时间帧数。 困难显然是可变数量的列。
Sport Jan 2010 Jan 2009 2009年 2月2010年 2月2009
篮球 26 18 23 16
曲棍球 28 19 25 18
游泳 52 45 48 43
客户可以为报告创建任意数量的命名事件计数器。 function始终相同:“名称”,“开始”,“结束”。
有没有什么方法可以将它组装成C#中的单个linq IQueryable结果?
就SQL而言,我尝试创建一个日期范围表{TimeFrameName,begin,end}并将其连接到上面的表,其中begin <= whenItHappened和whenItHappened <= end,这产生了一组很好的{EventName,TimeFrameName}然后做了一个count(*),但仍然留下了如何转换数据,使行成为列。
你有一个类/ 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(); 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是一个非常强大的运营商!