J'ai une table avec deux colonnes, GroupId et ParentId (les deux sont GUIDS). La table forme une hiérarchie donc je peux chercher une valeur dans le "GroupId" classé, quand je l'ai trouvé je peux regarder son ParentId. Ce ParentId apparaîtra également dans le GroupId d'un enregistrement différent. Je peux l'utiliser pour remonter l'arborescence de la hiérarchie depuis n'importe quel point jusqu'à la racine (root est un GUID vide). Ce que je voudrais faire, c'est obtenir une liste d'enregistrements quand je connais un GroupId. Ce serait l'enregistrement avec le GroupId et tous les parents de retour à l'enregistrement racine. Est-ce possible avec Linq et si oui, quelqu'un peut-il fournir un extrait de code?Marche d'une table hiérarchique avec Linq
Répondre
LINQ n'est pas conçu pour gérer la sélection récursive.
Il est certainement possible d'écrire votre propre méthode d'extension pour compenser cela dans LINQ to Objects, mais j'ai trouvé que LINQ to Entities n'aime pas la fonctionnalité qui n'est pas facilement traduite en SQL.
Edit: Bizarrement, LINQ to Entities ne se plaint pas de prise de Matt Warren sur récursion LINQ here. Vous pourriez faire:
var result = db.Table.Where(item => item.GroupId == 5)
.Traverse(item => db.Table.Where(parent
=> item.ParentId == parent.GroupId));
en utilisant la méthode d'extension définie ici:
static class LinqExtensions
{
public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source,
Func<T,IEnumerable<T>> selector){
foreach(T item in source){
yield return item;
IEnumerable<T> children = selector(item);
foreach (T child in children.Traverse(selector))
{
yield return child;
}
}
}
Performace peut être pauvre, cependant.
C'est certainement possible avec Linq, mais vous devez faire un appel DB pour chaque niveau de la hiérarchie. Pas exactement optimal.
Les autres répondants ont raison: la performance va être très mauvaise, car vous devrez faire plusieurs allers-retours. Cela dépendra un peu de votre cas particulier, cependant - votre arbre est profond et les gens vont effectuer cette opération souvent, par exemple.
Vous pouvez être bien servi en créant une procédure stockée qui le fait (en utilisant un CTE), et en le câblant dans le Concepteur d'Entités pour retourner votre Entité particulièrement définie.
- 1. Objet hiérarchique récupérer childsIds avec linq
- 2. stratification hiérarchique dans LINQ
- 3. Structure hiérarchique itération et LINQ
- 4. JQuery, pagination de table hiérarchique
- 5. Liaison de données hiérarchique avec Linq to SQL
- 6. Structure de table hiérarchique indentée
- 7. LINQ - peut-il faire marche arrière?
- 8. Wiki comme sur http://wiki.asp.net (avec table des matières hiérarchique)
- 9. Colonne de table hiérarchique dans Java
- 10. Grille hiérarchique avec MVCContrib
- 11. LINQ: Comment convertir l'objet hiérarchique imbriqué en objet aplati
- 12. linq joindre la table avec la collection
- 13. Entity Framework 4/Linq: Comment OrderBy() une entité hiérarchique?
- 14. Linq to Sql - Requête hiérarchique pour trouver des ancêtres
- 15. Linq: Conversion de la structure à plat hiérarchique
- 16. Comment insérer unique ID composite pour Table hiérarchique (SQL Server)
- 17. analyse Table d'auto-jointure hiérarchique par niveau d'arbre?
- 18. Implémentation d'arborescence hiérarchique
- 19. Hiérarchique Gridview
- 20. Grille hiérarchique
- 21. Menu de récursion hiérarchique avec PHP/MySQL
- 22. Création d'une construction hiérarchique avec SCons
- 23. problème avec la classification hiérarchique en Python
- 24. concepteur statecharts hiérarchique avec génération de code
- 25. Édition en ligne RadGrid avec DropDownLists hiérarchique
- 26. LINQ reformater en Table
- 27. LINQ "table" variable
- 28. Linq Table de coulée
- 29. Pilote Win32 API marche avec MinGW/MSYS?
- 30. iphone fbconnect. ça marche avec OS 2.2.1?
Pouvez-vous me diriger dans la direction de quelques informations concernant comment faire ceci? – Evildommer5