2016-09-30 1 views
4

Ich habe die Tabellenstruktur wie unten.Finden Sie die Tiefe Ebene in Eltern-Kind-Hierarchie

Id |ParentId| Name 
--- |--------|------- 
1 |NULL |A 
2 |1  |B 
3 |2  |C 
4 |3  |D 

A ist Elternteil von B, B ist Elternteil von C und C ist Elternteil von D.

ich berechnen wollen, wie können Eltern jeder Datensatz haben? Zum Beispiel bezieht sich B auf A, C bezieht sich auf B und D bezieht sich auf C.

In diesem Fall ist der Tiefenpegel für A 0, B ist 1, C ist 2 und D ist 3, basierend auf der Anzahl der Eltern haben.

Ich kann dies mit rekursive Funktion tun, Abfrage jedes Mal, wenn der Datensatz hat ein Elternteil. Ich möchte dies mit Linq Abfrage auf effiziente Weise erreichen.

Antwort

0

Ich denke, der beste Weg, dies ohne Überberechnung, mehrere Anfragen oder temporäre SQL-Tabellen zu erreichen, ist alle Tabelle auf einmal in einem Dictionary auswählen und Elternzahl auf C# -Seite zu berechnen.

Wenn es für Sie akzeptabel ist, könnte es diese Funktion und zusätzlich Klasse durchgeführt wird unter Verwendung von übermäßiger Berechnung zu verhindern:

public class ParentInfo 
{ 
    public int? ParentId { get; } 

    public int? ParentCount { get; set; } 

    public ParentInfo(int? parentId) 
    { 
     ParentId = parentId; 
    } 
} 

private static int GetParentCount(int id, IDictionary<int, ParentInfo> conections) 
{ 
    if (!conections.ContainsKey(id)) 
     throw new InvalidDataException($"Id = {id} not found in connections"); 
    var info = conections[id]; 
    if (info.ParentCount.HasValue) return info.ParentCount.Value; 

    var result = 0; 
    if (info.ParentId.HasValue) result += 1 + GetParentCount(info.ParentId.Value, conections); 
    info.ParentCount = result; 
    return result; 
} 

Dann können Sie führen diesen Code verwenden:

var conections = table.ToDictionary(r => r.Id, r => new ParentInfo(r.ParentId)); 
var result = conections.Select(c => new 
{ 
    Id = c.Key, 
    ParentCount = GetParentCount(c.Key, conections) 
}).ToArray(); 
Verwandte Themen