使用 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_TIME
和 WAIT_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()
});
我想使用以下方法按数据表分组。但是我不能 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_TIME
和 WAIT_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()
});