2016-10-07 2 views
-1

Я работаю над запросом groupby с использованием Linq, но хочу установить значение для нового свойства в сочетании с другим списком. Это мой код:Группа по свойствам 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 
        }) 

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

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

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

+0

* "У меня есть только к-доступ Key и Linq Методы "*,' b.Value'? –

+0

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

+3

@MattBurland В этом случае 'b' - это совокупность всех объектов в группе , Не существует свойства 'b.Value'. – krillgar

ответ

1

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

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

Почему?

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

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

Think операции Группировка в базе данных, где, когда вы 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 Key, нет b.Value, за что вашими варианты могут быть следующими или любыми другими соответствующими операции Linq:

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

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

Смежные вопросы