Ansioso cargar una tabla de autorreferencia
-
06-07-2019 - |
Pregunta
Tengo una tabla de referencias automáticas estándar de Categorías
. En mi modelo de entidad, he creado asociaciones Children
y Parent
. ¿Es posible cargar todo el objeto Category
sin carga lenta?
si uso el código siguiente, se carga solo al segundo nivel.
db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking;
var query = from c in db.Categories.Include("Children")
where c.IsVisible == true
orderby c.SortOrder, c.Id
select c;
¿Es posible cargar referencias si tengo todos los objetos de categoría ya cargados?
Un método para cargarlo es agregar la propiedad Children
varias veces
db.Categories.Include("Children.Children.Children.Children.Children")
pero esto genera un código T-SQL insano muy largo y tampoco hace lo que quiero.
Solución
No, no es posible. Considerar: Todas las consultas de LINQ to Entities se convierten a SQL. ¿Qué instrucción SQL incluye una profundidad ilimitada en una jerarquía autorreferenciada? En SQL estándar, no hay uno. Si hay una extensión para esto en T-SQL, no sé qué es, y tampoco creo que los proveedores de EF lo hagan.
Otros consejos
Ok, podrías considerar usar el método de carga.
if (!category.Children.IsLoaded)
category.Children.Load();
Por supuesto, ObjectContext debe rastrear la entidad de categoría.
Hay una mejor explicación aquí cómo-hace-marco-de-trabajo-con-jerarquías-recursivas-incluye-parece-no-ser .
Una forma que he usado para implementar eso es que si tengo varias entidades que quiero que todos los hijos incluyan en la tabla de autorreferencia es usar cte recursivo y procedimiento almacenado para obtener sus identificadores utilizando Entity FrameWork: Aquí está el código que utiliza Entity Framework y el primer enfoque del código