Données hiérarchiques dans Linq - options et performances
J'ai quelques données hiérarchiques - chaque entrée dispose d'un identifiant et d'un (nullable) parent de l'id d'entrée.
Je veux récupérer toutes les entrées dans l'arbre sous une donnée d'entrée. C'est dans un Serveur SQL server 2005 bases de données. Je suis d'interrogation avec LINQ to SQL en C# 3.5.
LINQ to SQL ne prend pas en charge Les Expressions De Table Communes directement. Mes choix sont à assembler les données dans le code avec plusieurs requêtes LINQ, ou pour faire une vue sur la base de données que les surfaces d'un CTE.
De l'option (ou une autre option) vous pensez que vous allez effectuer meilleure quand les volumes de données obtenez un grand?
Est SQL Server 2008 Type HierarchyId pris en charge dans Linq to SQL?
source d'informationauteur Anthony
Vous devez vous connecter pour publier un commentaire.
Je voudrais configurer une vue et une table de base de la fonction basée sur la CTE. Mon raisonnement est que, alors que vous pourriez mettre en œuvre la logique de l'application, cela reviendrait à envoyer les données intermédiaires sur le fil pour le calcul de l'application. À l'aide de la DBML designer, la vue se traduit par un Tableau de l'entité. Vous pouvez ensuite associer la fonction avec la Table de l'entité et invoquer la méthode créée sur le DataContext de dériver des objets du type défini par la vue. À l'aide de la table de fonction permet au moteur de requête de prendre vos paramètres en compte lors de la construction de l'ensemble de résultats, plutôt que d'appliquer une condition sur le résultat défini par la vue après le fait.
Pour l'utiliser, il ferait quelque chose comme, en supposant que certaines raisonnable schéma de nommage:
Ce option peut aussi s'avérer utile:
LINQ AsHierarchy() la méthode d'extension
http://www.scip.be/index.php?Page=ArticlesNET18
Je suis surpris que personne n'a fait allusion à un autre conception de base de données - lors de la hiérarchie doit être aplatie à partir de plusieurs niveaux et extrait avec de haute performance (pas si l'on considère l'espace de stockage), il est préférable d'utiliser une autre entité-2-table d'entité pour suivre la hiérarchie, au lieu de parent_id approche.
Il permettra non seulement unique parent de relations mais aussi multi parent des relations, des indications de niveaux et différents types de relations:
J'ai fait de deux façons:
Cette méthode d'extension pourrait être modifié pour utiliser IQueryable. Je l'ai utilisé avec succès dans le passé sur une collection d'objets. Il peut travailler pour votre scénario.
Voici comment je l'ai appelé:
Ce code est améliorée, bug de la version corrigée du code de ici.
Dans MS SQL 2008, vous pouvez utiliser HierarchyID directement, dans sql2005 vous pouvez avoir à mettre en œuvre manuellement. ParentID, ce qui n'est pas performant sur de grands ensembles de données. Vérifiez également cet article pour plus de discussion sur le sujet.
J'ai eu cette démarche de Rob Conery blog (vérifiez autour de Pt. 6 de ce code, également sur codeplex) et j'aime l'utiliser. Cela pourrait être amendée pour prendre en charge plusieurs "sous" les niveaux.
La difficulté à récupérer les données à partir du côté client, c'est que vous ne pouvez jamais être sûr à quelle profondeur vous devez aller. Cette méthode va faire un aller-retour par la profondeur et il pourrait être de l'union avais à faire à partir de 0 jusqu'à une certaine profondeur dans un aller-retour.
Il ne peut pas, cependant, faire de profondeur arbitraire. Si vous avez vraiment besoin profondeur arbitraire, vous avez besoin de le faire dans la base de données - afin que vous puissiez prendre la bonne décision d'arrêter.
Veuillez lire le lien suivant.
http://support.microsoft.com/default.aspx?scid=kb;en-us;q248915