使用 LINQ 在字符串列上使用 group by 时获取所有元素

Getting all elements while using group by on string column using LINQ

我想使用以下方法按数据表分组。但是我不能 select 包含字符串的列。

dtTA转换示例;

SAMPLE_TIME  WAIT_CLASS 
23:11:12     CPU
23:11:12     IO
23:11:12     IO
23:11:11     CPU
23:11:11     CPU

我要的就是这个;

SAMPLE_TIME  WAIT_CLASS COUNT
23:11:12     CPU        1
23:11:12     IO         2
23:11:11     CPU        2

到目前为止,我写了下面的代码;

var dtTAConvertList =
    (from dr1 in dtTAConvert.AsEnumerable()
     group dr1 by dr1.Field<DateTime>("SAMPLE_TIME") into g
     select new
     {
         SAMPLE_TIME = g.Key,
         WAIT_CLASS = g.Field<string>("WAIT_CLASS"),          // ==> I get error in this line
         COUNT = Math.Round(g.Sum(h => h.Field<double>("COUNT")) / 15.0, 2),
     });

它抛出异常

'IGrouping' 不包含 'Field' 的定义,最佳扩展方法重载 'DataRowExtensions.Field(DataRow, string)' 需要类型为 'DataRow'

的接收器

如果我将上面的代码更改为如下所示,它就可以工作;

WAIT_CLASS = g.First().Field<string>("WAIT_CLASS"),

然而这returns只是第一个元素,对我来说不起作用。

我如何 select 像我解释的那样字符串列?

您收到上述错误是因为 IGrouping 具有公共键 的对象集合不包含 [=28= 的定义].您可能希望这是 DataRow.

此外,目前您仅按 SAMPLE_TIME 进行分组,这不是您所需要的,您需要同时按 SAMPLE_TIMEWAIT_CLASS 进行分组才能获得上述结果.

以下是如何通过查询语法对这两个字段进行分组:

var result = from dr in dtTAConvert.AsEnumerable()
             group dr by new 
             {
                  sampleTime = dr.Field<DateTime>("SAMPLE_TIME"),
                  waitClass = dr.Field<string>("WAIT_CLASS")
             } into g
             select new
             {
                  SampleTime = g.Key.sampleTime,
                  WaitClass = g.Key.waitClass,
                  Count = g.Count()
             });

或流利的语法:

var result = dtTAConvert.AsEnumerable()
                .GroupBy(dr => new
                {
                    sampleTime = dr.Field<DateTime>("SAMPLE_TIME"),
                    waitClass = dr.Field<string>("WAIT_CLASS")
                }).Select(g => new
                {
                    SampleTime = g.Key.sampleTime,
                    WaitClass = g.Key.waitClass,
                    Count = g.Count()
                });