2016-10-13 20 views
1

我有一個SQL PROC返回結果這樣如何從字典和組列表中提取值並使用Linq轉換爲單個字典?

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查詢結果看起來像這樣,我不能改變這一點。

IEnumerable<IDictionary<string, object>> 

所需的結果:

利用這個結果和LINQ,我需要Dictionary<int,List<int>>,其中關鍵是GroupId的結束了,表是該組中personsid的列表。但我不知道如何去做。所以,我的最終結果字典將這個樣子

Key Value 
    1  2,3 
    2  4,6 

任何幫助,不勝感激 感謝

+0

你的結果是列表的'格式>'但是你的數據更適合'List >'的結構 - 你能解釋一下你的額外水平嗎?它在返回的數據中如何表示? –

+0

謝謝,我用我的格式更新了問題 – LePrinceDeDhump

+0

感謝您的更新。然而,我仍然不明白這是如何符合你描述的數據,你回來形成的過程 - 在問題的開始。 –

回答

2

我猜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()); 
+0

我想你是對的。尼斯 –

+0

@GiladGreen哈哈,謝謝! (正如你所知道的,我通常不會猜測:) –

+1

善良是知道而不是猜測,但當已經猜測猜測好:) –

0

使用查找來代替。所以:

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

查找在概念上等同於詞典,但允許每個鍵多個值,所以

lookup[1] 

返回一個值的IEnumerable<int> 2,3