Группировать по свойствам настройки Linq

#c# #linq

#c# #linq

Вопрос:

Я работаю над groupby запросом с использованием Linq, но я хочу установить значение для нового свойства в сочетании с другим списком. Это мой код:

 var result = list1.GroupBy(f => f.Name)
                  .ToList()
                  .Select(b => new Obj
                  {
                      ClientName = b.Name,
                      Status = (AnotherClass.List().Where(a=>a.state_id=b.????).First()).Status
                  })
  

Я знаю, что использую a group by , но я не уверен, как получить доступ к значению внутри моей b коллекции, чтобы сравнить его a.state_id .
Этот фрагмент:

 Status = (AnotherClass.List().Where(a=>a.state_id=b.????).First()).Status
  

Я делал это раньше, но несколько месяцев назад я не помню синтаксис, когда я ставлю точку позади b , у меня есть доступ только к Key методам и методам Linq… Каким должен быть синтаксис? `

Комментарии:

1. «У меня есть доступ только к ключу и методам Linq» , b.Value ?

2. A. Что именно вы хотите с этим сделать. Вы группируете по имени, но тогда кажется, что вы хотите выполнить поиск по статусу. Пожалуйста, предоставьте некоторые примеры данных с вводом и ожидаемым результатом B. ЕСЛИ вы уже делали это раньше, зачем публиковать вопрос и не находить ответ в Интернете

3. @MattBurland В этом случае — b это коллекция всех объектов внутри группы. Нет b.Value доступного свойства.

4. привет, ребята, я думаю, что нашел способ, которым это было очень просто, но я не смог вспомнить: Status = (RiPSCached.Status().Where(r => r.aut_id == b.Select(a => a.int_statusId).First()).First()).txt_status

5. b содержит элемент IGrouping, состоящий из двух свойств: .Key -> имя, по которому он был сгруппирован и . Подсчет -> Количество элементов, совместно использующих это имя

Ответ №1:

Проблема в вашем коде происходит здесь:

a=>a.state_id=b.????

Почему ?

Проверьте тип b здесь, это было бы IGrouping<TKey,TValue> , потому что, публикуя GroupBy на an IEnumerable , вы получаете результат как IEnumerable<IGrouping<TKey,TValue>>

Что это значит?

Подумайте об операции группировки в базе данных, где, когда вы GroupBy используете заданный Key , тогда оставшиеся выбранные столбцы нуждаются в операции агрегирования, поскольку на каждый ключ может быть более одной записи, и это должно быть представлено

Как это представлено в вашем коде

  1. Предположим list1 , имеет Type T объекты
  2. Вы сгруппировали данные по Name property , который является частью Type T
  3. Проекция данных отсутствует, поэтому для данного ключа он будет агрегировать оставшиеся данные в IEnumerable<T> виде сгруппированных значений
  4. Результат в формате IEnumerable<IGrouping<TK, TV>> , где TK Имя и ТВ представляют IEnumerable<T>

Давайте проверим некоторый код, разбейте исходный код на следующие части

  • var result = list1.GroupBy(f => f.Name) result будет иметь тип IEnumerable<IGrouping<string,T>> , где list1 IEnumerable<T>
  • При выполнении result.Select(b => ...) b имеет тип IGrouping<string,T>
  • Далее вы можете запускать запросы Linq b следующим образом: b.Key , предоставит доступ к Name ключу, нет b.Value , для этого вашими параметрами могут быть следующие или любые другие соответствующие операции Linq:

a=>b.Any(x => a.state_id == x.state_id) или // Удовлетворяет, если совпадение идентификатора в коллекции a=>a.state_id == b.FirstOrDefault(x => x.state_id) // Выбирает первое или значение по умолчанию

Таким образом, вы можете создать конечный результат из IGrouping<string,T> , в соответствии с логическим требованием / вариантом использования