Trouver racine dans une table structurée en arborescence de database en utilisant SQL

J'ai la table DB suivante décrivant une nomenclature, essentiellement une arborescence:

Part(PartId, ParentId, PartName) 

Les parties avec ParentId = 0 sont des produits finis, ce qui signifie qu'ils ne composent aucun autre produit.

Maintenant donné un PartId je voudrais savoir à quels produits il appartient en utilisant SQL pur (MS SQL Server) ou LINQ lambda

Essayez ce qui suit:

 ;WITH CTE AS ( SELECT PartId, ParentId FROM Part WHERE PartId = @PartId UNION ALL SELECT B.PartId, B.ParentId FROM CTE A INNER JOIN #Part B ON A.ParentId = B.PartId ) SELECT DISTINCT PartId FROM CTE WHERE ParentId = 0