【问题标题】:Getting all elements while using group by on string column using LINQ使用 LINQ 在字符串列上使用 group by 时获取所有元素
【发布时间】:2018-12-27 19:51:42
【问题描述】:

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

dtTAConvert 示例;

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"),

但是这仅返回第一个元素,这对我不起作用。

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

【问题讨论】:

  • 在您的预期输出中,您似乎希望同时按SAMPLE_TIMEWAIT_CLASS 进行分组,但您没有在查询中执行此操作。有什么理由吗?
  • @Aomine 好吧,我不知道。我真的不擅长linQ。如何将两者分组?

标签: c# .net linq datatable datarow


【解决方案1】:

您收到上述错误是因为IGrouping 所示,即具有公共键的对象集合不包含“字段”的定义。您可能希望这是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()
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多