2012-10-19 11 views
8

Die Absicht ist, die Liste nach dem Eltern und dann dem Kind zu sortieren (es wird nur ein Kind geben).Ausführen eines Elternteils dann untergeordnete Sortierung in Linq

Example Set: 
ID ParentId Type Unit 
1 NULL Energy kJ 
2 1  Cal 
3 NULL Protein g 
4 NULL Fat, total g 
5 4  Saturated g 
6 NULL Carbohydrate g 
7 6  Sugars g 
8 NULL Dietary fibre g 
10 NULL Sodium mg 
11 NULL Potassium mg 

So zum Beispiel, wenn ich sortiere nach Typ (alphabetische Reihenfolge), es würde kommen

  1. Carbohydrate
  2. Sugars (parent = 1.)
  3. Ballaststoffe
  4. Energie
  5. Cal (übergeordnete = 4.)
  6. Fett, insgesamt
  7. Gesättigte (parent = 6.)
+1

wenn Sie von Eltern und der sagen n mit Kind, meinst du die IDs? Oder meinst du, du willst P1, C1, P2, C2, P3, C3 usw. sehen? Es ist eine gute Frage, es ist einfach nicht klar, welche Ergebnisse Sie sehen möchten. Vielleicht ein Beispiel mit den Ergebnissen, die Sie erwarten würden? –

+0

@JamesMichaelHare Hinzugefügt erwarteten Satz in – ediblecode

+0

Ich würde von Ihren Daten annehmen, dass Sie garantiert sind, dass eine Kind-ID nie größer als ihre Eltern-ID ist? –

Antwort

4

Try this:

return myData.Select(x => new { key = (x.Parent ?? x).Type, item = x}) 
      .OrderBy(x => x.key) 
      .ThenBy(x => x.item.Parent != null) 
      .Select(x => x.item); 
+0

Das funktioniert. Nur für zukünftige Benutzer: es sollte '.ThenBy (x => x.item.Parent == null)' – ediblecode

+0

Hoppla. Bearbeitet. Danke, dass du das verstanden hast. – Bobson

+1

Ah ja, das funktioniert eigentlich nicht, es schien nur, weil meine Daten schon in der richtigen Reihenfolge waren. – ediblecode

1

Dieses in zwei Schritten durchgeführt werden konnte. Erste - Aufbau Eltern-Kind-Hierarchie (und sortieren es):

var query = from parent in data 
      where parent.ParentId == null 
      orderby parent.Type 
      join child in data on parent.ID equals child.ParentId into g 
      select new { Parent = parent, Children = g }; 

Second - schmeichelnde Hierarchie

var result = query.Flatten(x => x.Parent, x => x.Children); 

Denn ich schmeicheln verwendet Erweiterungsmethode:

public static IEnumerable<TResult> Flatten<T, TResult>(
    this IEnumerable<T> sequence, 
    Func<T, TResult> parentSelector, 
    Func<T, IEnumerable<TResult>> childrenSelector) 
{ 
    foreach (var element in sequence) 
    { 
     yield return parentSelector(element); 

     foreach (var child in childrenSelector(element)) 
      yield return child; 
    } 
}  
0

Diese

funktionieren sollte
var query = from p in context.Table 
      from c in context.Table.Where(x => p.ID == x.ParentId) 
            .DefaultIfEmpty() 
      let hasNoParent = c == null 
      orderby hasNoParent ? p.Type : c.Type, hasNoParent ? 0 : 1 
      select hasNoParent ? p.Type : c.Type; 
+0

Scheinbar existiert 'c' nicht im aktuellen Kontext – ediblecode

+0

@danrhul - Sorry, es hätte x sein sollen.ParentId – Aducci

+0

Hat nicht funktioniert Ich habe Angst, 6 Nullen, gefolgt von zufälligen wiederholten Daten – ediblecode

Verwandte Themen