2010-10-29 21 views
1

J'ai une table de catégorie auto référentiel que vous voyez:
alt textanalyse Table d'auto-jointure hiérarchique par niveau d'arbre?

Je veux analyser ce tableau pour connaître le niveau de l'arbre pour chaque catégorie. Par exemple, si le niveau du nœud racine est 0 alors CPU et Disque dur et VGA et RAM sont au niveau 1 et ainsi de suite. comment puis-je gérer cela?
J'ai créé un dictionnaire pour mettre chaque ID de catégorie et son niveau:

Dictionary<int, int> dic = new Dictionary<int, int>(); 

la clé est CategoryId et la valeur est de niveau. s'il vous plaît aidez-moi comment puis-je remplir le dictionnaire?

+1

Si vous utilisez SQL 2008, vous pouvez modifier la table d'auto-référence pour utiliser le nouveau type de données HierarchyID qui est parfait pour les hiérarchies comme celle-ci. Sinon, vous aurez besoin d'utiliser un CTE comme CesarGon a dit ... sauf si vous voulez faire l'analyse dans le code C#. – Dismissile

Répondre

2

Vous ne pouvez pas le faire facilement dans une seule requête LINQ. Vous devriez utiliser la récursivité. Ecrivez une fonction récursive en C# ou utilisez un CTE récursif dans la base de données.

Pour la solution C#:

IEnumerable<KeyValuePair<int, int>> GetChildren(int id, int childLevel) 
{ 
    foreach (var row in rows.Where(row => row.ParentID == id && row.ID != id)) 
    { 
     yield return new KeyValuePair<int, int>(row.ID, childLevel); 
     foreach (var x in GetChildren(row.ID, childLevel + 1)) 
     { 
      yield return x; 
     } 
    } 
} 

Appel comme suit:

GetChildren(0, 0); 
+0

il est préférable de le faire avec le code C# pour moi! – mahdiahmadirad

0

Je suis d'accord avec les réponses précédentes; vous ne pouvez pas faire une requête magique qui vous donnera le niveau de l'arbre. Hiérarchies comme celui-ci sont souvent mieux servis avec une structure de jeu imbriqué plutôt qu'un pointeur parent:

http://en.wikipedia.org/wiki/Nested_set_model

Cet article vous montre certaines questions courantes pour travailler avec des données de jeu imbriqué:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/