2010-09-27 88 views
2

我有一个表中存储数据值和两个分层标签的数据库。Linq GroupBy与多个组的投影

Data 
{ 
    int ID, 
    string Label, 
    string Section, 
    double Value 
} 

一个示例项,来说明我的问题:

{"Sport", "", 12} 
{"Sport", "Baseball", 33} 
{"Sport", "Football", 44} 

{"Food", "", 34} 
{"Food", "Pizza", 56} 
{"Food", "Donuts", 19} 

我希望能够打印出的价值观,像这样:

Sport | 12 
Baseball | 33 
Football | 44 

Food  | 34 
Pizza | 56 
Donuts | 19 

这是我的代码那就完成了我想要的50%:

var first = (from d in db.Data 
      where d.ID= PARAM 
      select d); 

var row = first.GroupBy(x => x.Label); 

     foreach (var k in row) 
     { 
      Console.Write(k.Key + "\t|"); 

      foreach (var j in k) 
      { 
       Console.Write(j.Data); 
      } 

      Console.Write("\n"); 
     } 

但这只是打印出来:

Sport | 12 
Sport | 33 
Sport | 44 

Food  | 34 
Food  | 56 
Food  | 19 

我明白为什么,我只是不知道如何从k.key部分访问.Section属性。

如何使用linq来实现我想要的输出?

我得到它的工作:

变种行= first.GroupBy(X =>新的{x.Label,x.Section});

  foreach (var k in row) 
     { 
      Console.Write(k.Key.Section == null || k.Key.Section == "" ? k.Key.Label : k.Key.Section); 
     ... 
     } 

新问题:

如何检测 “运动”/边缘 “民以食为天”。我想插入一个分隔符(------------);

+0

你们的榜样输出不匹配你的代码。 – dtb 2010-09-27 16:44:44

回答

2
foreach (var group in groups) 
{ 
    foreach (var item in group) 
    { 
     string label = !string.IsNullOrEmpty(item.Section) 
         ? item.Section 
         : item.Label; 

     Console.WriteLine("{0,-8} | {1}", label, item.Data); 
    } 

    Console.WriteLine("-------------"); 
} 

应打印

 
Sport | 12 
Baseball | 33 
Football | 44 
------------- 
Food  | 34 
Pizza | 56 
Donuts | 19 
-------------