#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