tags:

views:

38

answers:

1

I have a table in a DB that stores a Data Value and a two tiered label.

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

An example entry, to illustrate my problem:

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

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

I'd like to be able to print out the values like so:

Sport    | 12
Baseball | 33
Football | 44

Food     | 34
Pizza    | 56
Donuts   | 19

This is the code I have that accomplishes like 50% of what I want:

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");
         }

But this just prints out:

Sport    | 12
Sport    | 33
Sport    | 44

Food     | 34
Food     | 56
Food     | 19

I understand why, I just don't know how to access the .Section attribute from the k.key part.

How can I use linq to achieve my desired output?

I got it to work:

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);  
         ...
         }

New question:

How do I detect the edge of "Sport"/"Food." I want to insert a divider (------------);

+1  A: 
 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("-------------");
 }

should print

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