Как извлечь значения из списка словарей и групп и преобразовать в один словарь с помощью Linq?

#c# #linq

#c# #linq

Вопрос:

У меня есть sql proc, возвращающий такие результаты

 GroupId     PersonId
1           2
1           3
2           4
2           6
  

Это мой быстрый запрос, вызывающий сохраненный процесс

 List<IDictionary<string, object>> result = (dbconnection.Query("MyStoredProcName", null,
                    commandType: CommandType.StoredProcedure, commandTimeout: 0)
                    as IEnumerable<IDictionary<string, object>>).ToList();
  

Я пробовал это
var selectManyResult = result.SelectMany(r => r.ToDictionary(d => d.Key, d => (int)d.Value)); , но это кажется неправильным.

Обновление: для пояснения, мой результат из SQL-запроса dapper выглядит следующим образом, и я не могу это изменить.

 IEnumerable<IDictionary<string, object>>
  

Желаемый результат:

Используя этот результат и LINQ, мне нужно в конечном итоге Dictionary<int,List<int>> получить, где key — идентификатор группы, а List — список идентификаторов лиц в группе. Но я не совсем понимаю, как это сделать. Итак, мой словарь конечного результата будет выглядеть так

    Key    Value
    1       2,3
    2       4,6
  

Любая помощь с благодарностью
Спасибо

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

1. Ваш результат в формате List<IDictionary<string, object>> , но ваши данные больше соответствуют структуре List<Tuple<x,y>> — Не могли бы вы объяснить, какой у вас дополнительный уровень? Как это представлено в возвращаемых данных?

2. Спасибо, я обновил вопрос своим форматом

3. Спасибо за обновление. Однако я все еще не понимаю, как это согласуется с данными, которые вы описываете, которые вы получили из процедуры — в начале вопроса..

4. какого черта вы ожидаете список <Словарь<строка, объект>> ?? результат ясно показывает, что ваши возвращаемые значения — это просто словарь<TKey, TValue>

Ответ №1:

Я думаю IDictionary<string, object> , это лучший способ представления (имя, значение) пар (свойств). В вашем случае ключами должны быть «groupId» и «PersonID», чтобы вы могли достичь цели с помощью чего-то подобного:

 var groupedResult = result.GroupBy(e => (int)e["GroupId"])
    .ToDictionary(g => g.Key, g => g.Select(e => (int)e["PersonId"]).ToList());
  

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

1. @GiladGreen Ха-ха, спасибо! (как вы знаете, я обычно стараюсь не угадывать 🙂

2. Быть хорошим — это знать, а не угадывать, но когда уже угадать, угадать хорошо 🙂

3. Отлично сработало. Спасибо

Ответ №2:

Вместо этого используйте поиск. Итак:

 var lookup = result.ToLookup(r => r.GroupId, r => r.PersonId)
  

поиск концептуально такой же, как словарь, но допускает несколько значений для каждого ключа, поэтому

 lookup[1]
  

возвращает IEnumerable<int> значение со значениями 2,3