2010-01-06 15 views
7

Tengo una estructura de árbol de gráfico de organización almacenada en una base de datos. Es algo así comoRecuperar una estructura de árbol de una base de datos utilizando LINQ

ID (int); 
Name (String); 
ParentID (int) 

En C# es representada por una clase como

class Employee 
{ 
int ID, 
string Name, 
IList < Employee> Subs 
} 

Me pregunto cómo es la mejor manera de recuperar estos valores de la base de datos para llenar los objetos de C# utilizando LINQ (estoy usando Entity Framework)

Debe haber algo mejor que hacer una llamada para obtener el nivel superior y luego hacer llamadas repetidas para obtener subs, etc.

¿La mejor manera de hacerlo?

consulta

Respuesta

1

Agregaría un campo a la entidad para incluir la ID principal, luego insertaría toda la tabla en la memoria, dejando los Listubs null. Id luego recorre los objetos y completa la lista usando linq para objetos. Solo una consulta de DB debe ser razonable.

+0

la manera que he encontrado para hacer esto era algo así como foreach (posición Posición en total) { foreach (posición posición1 en total) { si (== position1.ParentPositionID position.ID) {if ( position.Subs == null) { position.Subs = nueva lista de (); } position.Subs.Add (position1); } } } ¿Hay una manera mejor? – Emad

0

Bueno ... incluso con LINQ necesitarás dos consultas, porque cualquier consulta individual duplicará al empleado principal y por lo tanto dará como resultado la creación de múltiples empleados (que son realmente iguales) ... Sin embargo, puedes ocultar esto un poco con linq cuando creas el objeto, es cuando ejecutarías la segunda consulta, algo como esto:

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() 
     }; 
3
  1. Puede construir un proceso almacenado que tenga incorporada la recursión. Eche un vistazo a http://msdn.microsoft.com/en-us/library/ms190766.aspx para obtener más información sobre Expresiones de tabla comunes en SQL Server
  2. Es posible que desee encontrar una forma diferente (¿mejor?) De modelar sus datos. http://www.sqlteam.com/article/more-trees-hierarchies-in-sql enumera una forma popular de modelar datos jerárquicos en una base de datos. Cambiar el modelado puede permitirle crear consultas que se pueden expresar sin recurrencia.
2

Si está utilizando SQL Server 2008, puede hacer uso de la función new HIERARCHYID.

Las organizaciones han tenido problemas en el pasado con la representación de árbol como estructuras en las bases de datos, muchos de se une a un montón de lógica compleja entra en el lugar, si se trata de la organización jerarquía o la definición de una lista de materiales (Bill de Materiales) donde un producto terminado depende de otros materiales semi terminados/artículos del kit y estos artículos del kit dependen de otros artículos o materias primas semielaborados .

SQL Server 2008 tiene la solución para el problema donde almacenamos todo el jerarquía en el tipo de datos HierarchyID. HierarchyID es una variable tipo de datos del sistema de longitud.HierarchyID se utiliza para localizar la posición en el jerarquía del elemento como Scott es el CEO y Mark, así como Ravi informes a Scott y Ben y Laura informe a Marcos, Vijay, James y Frank informe a Ravi.

Utilice las nuevas funciones disponibles y simplemente devuelva los datos que necesita sin usar LINQ. El inconveniente es que tendrá que utilizar UDF o procedimientos almacenados para nada más allá de un simple consulta de la raíz:

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