Linq查询按组加总

时间:2013-06-25 14:11:32

标签: c# linq linq-to-dataset

我有一个这样的数据表:

Category         Description       CurrentHours      CTDHours  
LC1              Cat One                 5               0  
LC2              Cat Two                 6               0  
LC3              Cat Three              18               0  
LC1              Cat One                 0               9  
LC2              Cat Two                 0              15  
LC4              Cat Four                0              21  

我需要对此进行分组和求和:

Category         Description       CurrentHours      CTDHours  
LC1              Cat One                 5              14  
LC2              Cat Two                 6              21  
LC3              Cat Three              18               0  
LC4              Cat Four                0              21  

换句话说,我需要按类别和说明列对两小时列进行分组。

我知道我可以构建一个新表并循环遍历现有数据并将数据汇总到新表中但我认为使用Linq可以更容易地实现它。我用谷歌搜索了几个小时,但我找到的所有例子似乎都不适合我想做的事。

BTW,创建数据表的odbc驱动程序没有子查询等功能,或者我只是使用SQL完成它。

2 个答案:

答案 0 :(得分:32)

使用匿名对象按类别和说明进行分组。这是Linq to DataSet查询,它返回分组小时:

from r in table.AsEnumerable()
group r by new { 
     Category = r.Field<string>("Category"),
     Description = r.Field<string>("Description")
} into g
select new {
   Category = g.Key.Category,
   Description = g.Key.Description,
   CurrentHours = g.Sum(x => x.Field<int>("CurrentHours"),
   CTDHours = g.Sum(x => x.Field<int>("CurrentHours") + x.Field<int>("CTDHours"))
} 

如果您正在查询数据库(不清楚问题):

from r in context.Table
group r by new { 
     r.Category,
     r.Description
} into g
select new {
   g.Key.Category,
   g.Key.Description,
   CurrentHours = g.Sum(x => x.CurrentHours),
   CTDHours = g.Sum(x => x.CTDHours + x.CurrentHours)
}

答案 1 :(得分:0)

您需要将CurrentHoursCTDhours相加,所以 -

select new {
   ...
   CTDHours = g.Sum(x => x.Field<int>("CTDHours") + g.Sum(x => x.Field<int>("CurrentHours")
}