2009-10-12 10 views
0

en doublemany times over (et these)Essayer d'utiliser LINQ pour rechercher la base du tableau avec des données hiérarchiques

J'ai une table appelée Types qui a les colonnes suivantes.

ID Niveau Nom ParentID (ID de la ligne parente)

et une table appelée ParentObjet qui a les colonnes suivantes. ID TypeID

Il existe 4 niveaux différents (pouvant être étendus à plus).

Donc, si j'avais

ID: 1 Niveau: 0 Nom: Level0 ParentID: null

ID: 2 Niveau: 1 Nom: Niveau1 ParentID: 1

ID: 3 Niveau: 2 Nom: Level2 ParentID: 2

ID: 4 Niveau: 3 Nom: Level3 ParentID: 3

ID: 5 Niveau: 4 Nom: Level4 ParentID: 4

Dans le tableau ParentObjet je stocke l'arbre en tout stocker l'identifiant de niveau le plus bas. Donc, si l'ID que j'ai est 4, je sais que l'arbre va effectivement Level0 -> Level1 -> Level2 -> Level3

Fondamentalement, je dois être en mesure de rechercher tous les objets pour un certain type, ou Type Niveau 2 par exemple dans une déclaration linq.

Dites que le TypeID stocké dans la table ParentObject est 4, donc Level3.

Mais je veux vraiment chercher tous les ParentObjects où le type de niveau 2 a une carte d'identité de 3.

Quelle serait la meilleure façon de le faire depuis l'identifiant stocké pourrait être un niveau1 ou un niveau 2, etc. ?

De préférence dans une déclaration linq si possible.

+0

Je pourrais vous montrer comment dans les procédures stockées avec une expression de table commune ... pas sûr de linq tho: '( – JustLoren

Répondre

0

Dans SQL (MS SQL Server 2005+), vous pouvez utiliser un Common Table Expression pour implémenter la récursivité. LINQ ne prend pas en charge CTE. Un couple de travaux autour serait un pour créer la procédure stockée et le mapper comme une méthode à votre contexte de données.

Une autre solution serait d'écrire le code SQL directement dans votre code C# et que LINQ l'exécute. Voir this.

Ou vous pouvez écrire un peu de code C# qui sélectionne vos données jusqu'à ce qu'il n'y ait plus d'ID parents. Un exemple approximatif serait ...

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     IList<Data> data = new List<Data>(); 

     data.Add(new Data() { ID = 1, ParentID = 0, SomeData = "Example" }); 
     data.Add(new Data() { ID = 2, ParentID = 1, SomeData = "Another Example" }); 
     data.Add(new Data() { ID = 3, ParentID = 2, SomeData = "Example three" }); 
     data.Add(new Data() { ID = 4, ParentID = 3, SomeData = "Last example" }); 

     IList<Data> results = new List<Data>(); 

     Int32 parentID = 2; 

     while (parentID > -1) 
     { 
      results.Add(
       data.Where(x => x.ParentID == parentID).Single() 
      ); 

      parentID--; 
     } 
    } 
} 

public class Data 
{ 
    public Int32 ID { get; set; } 
    public Int32 ParentID { get; set; } 
    public String SomeData { get; set; } 
} 

Espérons que cela aide!

Questions connexes