¿Selección recursiva a través de LINQ? [duplicar
Posible duplicado:
linq a sql consulta recursiva
e atasqué con tener que crear una selección recursiva a través de LINQ para la tabla de autorreferencia.
Yo uso esta clase:
public class DivisionHierarchy
{
public Division Division { get; set; }
public IEnumerable<DivisionHierarchy> Divisions { get; set; }
}
y creé esta función pero de alguna manera es infinita.
public IEnumerable<DivisionHierarchy> GetDivisionHierarchy(IEnumerable<Division> allDivisions, Division parentDivision)
{
Guid? parentDivisionId = null;
if (parentDivision != null)
parentDivisionId = parentDivision.DivisionID;
var childDivisions = allDivisions.Where(e => e.DivisionID == parentDivisionId);
Collection<DivisionHierarchy> hierarchy = new Collection<DivisionHierarchy>();
foreach (var div in childDivisions)
hierarchy.Add(new DivisionHierarchy() { Division = div, Divisions = GetDivisionHierarchy(allDivisions, div) });
return hierarchy;
}
¿Alguna idea de por dónde puedo comenzar?
¡Gracias
PD. ¿Hay alguna otra forma de hacerlo?
UPDATES basados enhttp: //www.scip.be/index.php? Page = ArticlesNET18 # AsHierarchy
Encontré mis errores.
Hay 2 cosas para implementar: 1. El nodo raíz debe crearse en la base de datos.
He cambiado un poco el código.
Guid divisionID = Guid.Parse("5b487b3d-e9be-413f-b611-2fd7491e0d0d"); // Hardcoded somehow
var rootDivision = db.Divisions.Where(i => i.ID == divisionID).FirstOrDefault();
var divisionHierarchy = GetDivisionHierarchy(db.Divisions.AsEnumerable(), rootDivision);
...
public IEnumerable<DivisionHierarchy> GetDivisionHierarchy(IEnumerable<Division> allDivisions, Division parentDivision)
{
Guid? parentDivisionId = null;
if (parentDivision != null)
parentDivisionId = parentDivision.ID;
var childDivisions = allDivisions.Where(division => division.DivisionID == parentDivisionId);
Collection<DivisionHierarchy> hierarchy = new Collection<DivisionHierarchy>();
foreach (var div in childDivisions)
{
DivisionHierarchy divisionHierarchy = new DivisionHierarchy();
divisionHierarchy.Division = div;
divisionHierarchy.Divisions = GetDivisionHierarchy(allDivisions, div);
hierarchy.Add(divisionHierarchy);
}
return hierarchy;
}