2010-09-27 8 views
2

J'ai une table dans une base de données qui stocke une valeur de données et une étiquette à deux niveaux.Groupe LinqPar projection avec plusieurs groupes

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

Un exemple d'entrée, pour illustrer mon problème:

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

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

Je voudrais être en mesure d'imprimer les valeurs comme ceci:

Sport | 12 
Baseball | 33 
Football | 44 

Food  | 34 
Pizza | 56 
Donuts | 19 

C'est le code I avoir cela accomplit comme 50% de ce que je veux:

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

Mais se contente d'afficher:

Sport | 12 
Sport | 33 
Sport | 44 

Food  | 34 
Food  | 56 
Food  | 19 

Je comprends pourquoi, je ne sais pas comment accéder à l'attribut .Section de la partie k.key. Comment puis-je utiliser linq pour obtenir la sortie souhaitée?

Je l'ai au travail:

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

Nouvelle question:

Comment puis-je détecter le bord du "Sport"/"Food." Je veux insérer un diviseur (------------);

+0

Votre exemple de sortie ne correspond pas à votre code. – dtb

Répondre

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

devrait imprimer

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