Récupérer une arborescence d’une firebase database en utilisant LINQ

J’ai une structure d’arborescence d’organigramme stockée dans une firebase database. C’est quelque chose comme

ID (int); Name (Ssortingng); ParentID (int) 

En C #, il est représenté par une classe comme

 class Employee { int ID, ssortingng Name, IList  Subs } 

Je me demande quel est le meilleur moyen d’extraire ces valeurs de la firebase database pour remplir les objects C # à l’aide de LINQ (J’utilise Entity Framework).

Il doit y avoir quelque chose de mieux que de passer un appel pour accéder au niveau supérieur puis de faire des appels répétés pour obtenir des sous-marins, etc.

Comment le mieux faire?

J’appendais un champ à l’entité pour inclure l’ID parent, puis je mettrais la table entière en mémoire, laissant les sous-listes Null. Id, puis parcourir les objects et remplir la liste à l’aide de linq en objects. Une seule requête de firebase database doit donc être raisonnable.

  1. Vous pouvez construire un proc stocké qui a intégré la récursivité. Consultez le site http://msdn.microsoft.com/en-us/library/ms190766.aspx pour plus d’informations sur les expressions de table communes dans SQL Server.
  2. Vous voudrez peut-être trouver un moyen (meilleur?) Différent de modéliser vos données. http://www.sqlteam.com/article/more-trees-hierarchies-in-sql répertorie un moyen courant de modéliser des données hiérarchiques dans une firebase database. La modification de la modélisation peut vous permettre de créer des requêtes pouvant être exprimées sans récursivité.

Si vous utilisez SQL Server 2008, vous pouvez utiliser la nouvelle fonctionnalité HIERARCHYID .

Les organisations ont déjà eu du mal à représenter des structures semblables à des arbres dans les bases de données. De nombreuses jointures impliquent beaucoup de logique complexe, qu’il s’agisse d’une hiérarchie d’organisation ou de la définition d’une nomenclature (Bill of Materials) dans laquelle un produit fini dépend d’un autre produits semi-finis / articles en kit et ces articles en kit dépendent d’autres articles semi-finis ou matières premières.

SQL Server 2008 apporte la solution au problème de stockage de la hiérarchie entière dans le type de données HierarchyID. HierarchyID est un type de données système de longueur variable. HierarchyID est utilisé pour localiser la position dans la hiérarchie de l’élément, comme Scott est le PDG et Mark ainsi que Ravi rapporte à Scott et Ben et Laura rend compte à Mark, Vijay, James et Frank rendent compte à Ravi.

Utilisez donc les nouvelles fonctions disponibles et renvoyez simplement les données dont vous avez besoin sans utiliser LINQ. L’inconvénient est que vous devrez utiliser UDF ou des procédures stockées pour tout ce qui va au-delà d’une simple requête racine:

 SELECT @Manager = CAST('/1/' AS hierarchyid) SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL) 

Une requête Entity Framework devrait vous permettre d’inclure des ensembles d’entités apparentées, même si dans une relation unaire, vous ne savez pas comment cela fonctionnerait …

Consultez cette page pour plus d’informations à ce sujet: http://msdn.microsoft.com/en-us/library/bb896272.aspx

Eh bien … même avec LINQ, vous aurez besoin de deux requêtes, car chaque requête dupliquera l’employé principal et entraînera ainsi la création de plusieurs employés (qui sont vraiment les mêmes) … Cependant, vous pouvez cacher cela un peu linq lorsque vous créez l’object, c’est à ce moment-là que vous exécuteriez la deuxième requête, quelque chose comme ceci:

 var v = from u in TblUsers select new { SupervisorName = u.DisplayName, Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList() };