2010-11-01 6 views
3

J'ai une table dans SQL Server qui est structuré comme suit:L'utilisation de LINQ pour sélectionner des données hiérarchiques?

id Name Parent 
-- ---- ------ 
1 foo null 
2 bar 1 
3 oof null 
4 rab 3 
. 
. 
. 

J'ai besoin pour obtenir les données des deux lignes associées comme une ligne dans un DataTable .NET. Mon DataTable désiré ressemblerait à ceci:

Parent Child 
------ ----- 
foo  bar 
oof  rab 

j'ai pu y parvenir en utilisant la requête suivante:

with temp as 
(
    SELECT 1 id,'foo' name, null parent 
    UNION 
    select 2,'bar', 1 
    UNION 
    SELECT 3,'oof', null 
    UNION 
    select 4,'rab', 3 
) 

SELECT t1.name parent, t2.name child 
FROM temp t1 
INNER JOIN temp t2 
ON t1.id = t2.parent 

Mais je suis curieux de savoir s'il existe un moyen facile de le faire en utilisant LINQ? (Notre boutique utilise LINQ pour un accès plus la base de données)

Répondre

1
DataTable dt = new DataTable() 
//Other DT stufff 

//LINQ Query 
var data = from t in table 
      select t; 

//Loop to create DT 
foreach (item in data.ToList()) 
{ 
    DataRow dr = new DataRow(); 
    dr["Parent"] = item.Name; 
    dr["Child"] = item.item.Name; //Where item.item is your FK relation to itself 
    dt.Rows.Add(dr); 
} 
+0

Votre déclaration LINQ est ici un no-op ... pourquoi ne pas utiliser une jointure LINQ? –

0
data.Select(d => d.Parent).Select(p => p.Property).ToList(); 

select vient projeter les résultats à vous paresseux chargé. Tellement simple, sélectionnez ce dont vous avez besoin dans une liste locale, ou avec une petite syntaxe, vous pouvez utiliser la projection anonyme pour mettre en bouteille tous les niveaux de données ensemble et filtrer dessus avant de .ToList() revenir à vous.

0
var result = source.Select(child => new { 
Child = child, 
Parent = source.SingleOrDefault(parent => parent.ID == child.Parent) 
}); 
2

Je préfère garder les jointures comme joint

var result = from t1 in table 
join t2 in table on t1.id = t2.parent 
select new { parent = t1.name, child = t2.name } 
Questions connexes