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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top