Получение всех элементов при использовании группировки по строковому столбцу с использованием LINQ - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу сгруппировать по датам, используя следующий метод.Однако я не могу выбрать столбец, который содержит строку.

Пример 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

Пока что я написал нижеcode;

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

Однако это возвращает только первый элемент, который не работает для меня.

Как выбрать строковый столбец, как я объяснил?

1 Ответ

0 голосов
/ 27 декабря 2018

Вы получаете указанную ошибку, потому что, как показано IGrouping, то есть коллекция объектов, имеющих общий ключ , не содержит определения «Поле».вы, вероятно, ожидали, что это будет 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()
                });
...