#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
, тогда оставшиеся выбранные столбцы нуждаются в операции агрегирования, поскольку на каждый ключ может быть более одной записи, и это должно быть представлено
Как это представлено в вашем коде
- Предположим
list1
, имеетType T
объекты - Вы сгруппировали данные по
Name property
, который является частьюType T
- Проекция данных отсутствует, поэтому для данного ключа он будет агрегировать оставшиеся данные в
IEnumerable<T>
виде сгруппированных значений - Результат в формате
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>
, в соответствии с логическим требованием / вариантом использования