2015-05-14 65 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

嗨鲍勃谢谢:)它为我工作。 –