Linq Group通过多个组进行投影

时间:2010-09-27 16:38:19

标签: c# linq

我在数据库中有一个存储数据值和两个分层标签的表。

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

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

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

我得到了它的工作:

var row = first.GroupBy(x => new {x.Label,x.Section});

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

新问题:

如何检测“运动”/“食物”的边缘。我想插入一个divider(------------);

1 个答案:

答案 0 :(得分: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
-------------