2016-05-15 6 views
0

In den letzten 2 Tagen habe ich versucht, die untergeordneten Knoten zu berechnen, die in C# unter dem bestimmten Elternteil kommen. Grundsätzlich habe ich in meiner Datenbank eine SQL-Tabelle mit 2 Spalten: user_id, Users_parentId. Beispiel:Wie zählen die gesamten untergeordneten Knoten unter dem bestimmten Elternteil in C#?

__________________________ 
User_Id | Users_parentId 
__________________________ 
100  | Noparent(main) 
-------------------------- 
101  | 100(first User) 
-------------------------- 
102  | 100 
-------------------------- 
103  | 100 
-------------------------- 
104  | 102 (3rd User) 
-------------------------- 
105  | 100 
-------------------------- 
106  | 102 
-------------------------- 
107  | 102 
-------------------------- 
111  | 107 (8th user) 
-------------------------- 
112  | 107 
-------------------------- 
115  | 105 (6th user) 
-------------------------- 
222  | 105 
-------------------------- 
225  | 112 
-------------------------- 
336  | 112 
-------------------------- 
666  | 112 
  • Wenn wir einen Baum aus der obigen Tabelle erzeugen, dann wird es so aussehen:

         100 
          ----------^------------- 
          | |  |  | 
          101 102  103  105 
         --------^------  ----^-------- 
         |  |  |   |   | 
         104 106 107  115  222 
           ------^----- 
           |   | 
           111  112 
            ------^------ 
            |  |  | 
            225 336 666 
    
  • Also in meinem Projekt mag ich alle Kinder berechnen kommt unter die 100

  • Grundsätzlich habe ich versucht mit get child list und dann zählen sie ihr Kind, und wenn sie dann wieder greifen grand_child die untergeordnete Liste und so weiter, rekursiv.

  • Ich habe versucht mit for-Schleifen und foreach-Schleifen, aber habe keine Lösung gefunden.

  • Ich möchte insgesamt Summe Kind (bedeutet jetzt 100 enthält 14 Kind) beim Laden der Seite Ereignis.

  • Wenn Benutzer sich anmeldet, möchte ich zu diesem Zeitpunkt alle Kinder berechnen, die unter ihn kommen.

  • Ich benutze Entity Framework und LINQ auf die Datenbank zuzugreifen, My Name der Datenbank GetUnitedDB ist ist Tablename Office_Detail

  • Wenn es irgendwelche Fehler oder unvollständige Informationen über zur Verfügung gestellt, informieren Sie mich bitte. Und bitte schlagen Sie Logik in C# vor.

Antwort

1

Sie einen Blick auf Ihre SQL-Datenbank hinzufügen können, die folgende Vorlage:

;WITH UserTree AS 
     (
      SELECT tn.User_Id UserId, tn.Users_parentId UserParentId, 0 AreaLevel 
       FROM Office_Detail tn 
       WHERE tn.Users_parentId = 100 
      UNION ALL 
       SELECT tn.User_Id, tn.Users_parentId, at.AreaLevel+1 AreaLevel 
       FROM UserTree at 
        INNER JOIN Office_Detail tn on at.UserId = cn.Users_parentId      
     ) 
     select COUNT(UserId) 
     from UserTree 

betrachten auch des Typs der 100-Wert auf einen Parameter ändern Sie die user_id mit und senden es in der Anfrage der Ansicht.

C# -Implementierung mit Rekursion (diese Vorlage kann auch den Baum mit seinem Level zu erstellen verwendet werden):

private static int Count(int OriginalId) 
    { 
     using (var ctx = new YourDBContext()) 
     { 
      return FindAllSons(OriginalId, ctx); 
     } 
    } 

    private static int FindAllSons(int id, YourDBContext ctx) 
    { 
     var res = 1; 
     var children = ctx.TableName.Where(x => x.ParentId == id).Select(n => n.Id); 
     foreach(var child in children) 
     { 
      res += FindAllSons(child, ctx); 
     } 
     return res; 
    } 
+0

Ok, aber ich will es in C# ... so können Sie mir helfen in C# –

+0

Was ist _UserTree_ Sie in Ihrem Code verwendet ... ?? –

+0

Überprüfen Sie das Update – Moshezaurus

Verwandte Themen