我认为我需要一种方法来使用 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
您有一个类/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是一个非常强大的运算符!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)