2015-05-14 79 views
0

我有一個數據庫,它看起來像這樣的數據(簡化)填充嵌套的字典從數據庫查詢C#

colA, colB, colC 
'a', 1, 'abc' 
'a', 2, 'def' 
'b', 1, 'ghi' 
'b', 2, 'jkl' 

我的目標是建立從該表中嵌套的字典,看起來像這樣:

dict = {a: {1: 'abc'}, {2: 'def'}, 
     b: {1: 'ghi'}, {2: 'jkl'}} 

我在我的真實情況下有更多的嵌套層次。作爲一個數據庫查詢,我想我可以一行一行'for'循環行

任何建議以優雅/有效的方式填充字典這種方式?

+0

你是如何從數據庫中讀取表 - DataReader的,datatableadapter還是其他? –

+0

我正在執行選擇查詢以將數據加載到數據集。並從數據集中加載到類對象。 –

+0

那麼我的答案將適用於從數據集中提取(只需使用'dataset.tables [「」] .AsEnumerable()'而不是'table.AsEnumerable()'。或者,如果您可以提供您的類對象定義,我可以更新我的回答 –

回答

1

此答案假設您使用DataTable來存儲您的SQL結果,但可以適應使用ORM對象。

我手動填充我的數據表像這樣:

var table= new DataTable("test"); 
table.Columns.AddRange(new [] { 
    new DataColumn("colA",typeof(string)), 
    new DataColumn("colB",typeof(int)), 
    new DataColumn("colC",typeof(string))} 
); 
table.Rows.Add("a",1,"abc"); 
table.Rows.Add("a",2,"def"); 
table.Rows.Add("b",1,"ghi"); 
table.Rows.Add("b",2,"jkl"); 

您可以使用適當的DataTableAdapter數據庫類型填充您的表。

一旦你的數據表,你可以創建你的字典裏,像這樣:

var result = table.AsEnumerable() 
        .GroupBy(r => r["colA"]) 
        .ToDictionary(g => g.Key, 
           g => g.GroupBy(r => r["colB"]) 
             .ToDictionary (g2 => g2.Key, 
                g2 => g2.Select(r => r["ColC"]) 
                  .First() 
                ) 
           ); 
+0

嗨鮑勃謝謝:)它爲我工作。 –