Как сгруппировать, используя анонимный тип - PullRequest
0 голосов
/ 09 февраля 2019

Я получаю набор результатов из запроса linq, а затем использую group by для группировки по двум полям:

var dataElements = dataElements.GetAll();

var dataItems = dataElements.Where(el => el.Field1 == "DATE")
     .GroupBy(x => new { x.Field2, x.Field3})
     .ToList();

//why can't I do this:
foreach (var element in dataItems)
{
    Console.WriteLine(element.Field2)
}

Я получаю следующую ошибку:

Код серьезностиОписание Ошибка состояния подавления строки файла проекта CS1061 «IGrouping <, dataElements>» не содержит определения для «Field2», и нет доступного метода расширения «Field2», принимающего первый аргумент типа «IGrouping <, dataElements>» (являютсявы пропустили директиву using или ссылку на сборку?) App.Program C: ..... cs 498 Active

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Как говорится, группа не знает, что такое Field2, поэтому вам нужно захватить каждый элемент группы.Попробуйте это:

foreach (var group in dataItems) 
{ 
    foreach(var element in group)
    {
        Console.WriteLine(element.Field2);
    }
}

Это можно сделать, потому что dataItem само по себе имеет Field2.Это будет проходить через каждый элемент каждой группы.Если вы хотите показать только ключи групп, просто нажмите клавишу:

foreach (var group in dataItems) 
{
     Console.WriteLine(group.Key.Field2);
}
0 голосов
/ 09 февраля 2019

Вам нужно сначала выбрать Key перед Field2.Попробуйте это:

foreach (var element in dataItems)
{
    Console.WriteLine(element.Key.Field2)
}
0 голосов
/ 09 февраля 2019

Вам нужно выбрать поля перед доступом к ним:

var dataItems = dataElements.Where(el => el.Field1 == "DATE")
 .GroupBy(x => new { x.Field2, x.Field3})
 .Select(x=>new {Field2=x.FirstOrDefault().Field2})
 .ToList();

теперь вы можете получить доступ к Поле2 :

foreach (var element in dataItems)
{
  Console.WriteLine(element.Field2)
}

В качестве альтернативы вы можете сделать этов вашем цикле:

foreach (var group in dataItems)
{
  foreach(var item in group)
     Console.WriteLine(item.Field2);
}
...