Domanda

Ho una tabella standard autoreferenziale di Categorie . Nel mio modello di entità ho creato associazioni Children e Parent . È possibile caricare l'intero oggetto Categoria senza caricamento lento?

se uso il codice seguente, viene caricato solo al secondo livello.

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;

È possibile caricare i riferimenti se ho già tutti gli oggetti della categoria caricati?

Un metodo per caricarlo è aggiungere la proprietà Children più volte

db.Categories.Include("Children.Children.Children.Children.Children")

ma questo genera un codice T-SQL folle molto lungo e inoltre non fa quello che voglio.

È stato utile?

Soluzione

No, non è possibile. Considerare: tutte le query LINQ to Entities sono tradotte in SQL. Quale istruzione SQL include una profondità illimitata in una gerarchia autoreferenziale? In SQL standard, non ce n'è uno. Se esiste un'estensione per questo in T-SQL, non so di cosa si tratti e non credo neanche i provider EF.

Altri suggerimenti

Ok, potresti prendere in considerazione l'utilizzo del metodo Load.

 if (!category.Children.IsLoaded)
        category.Children.Load();

Ovviamente, l'entità categoria deve essere tracciata da ObjectContext.

C'è una spiegazione migliore qui come se-soggetto-quadro-lavoro-con-recursive-gerarchie-include-sembra-not-a .

Un modo in cui ho usato per implementare che se ho diverse entità che voglio portare tutti i bambini nella tabella di autoreferenziazione è usare codice ricorsivo e stored procedure per ottieni i loro ID usando Entity FrameWork: Ecco il codice che utilizza Entity Framework e il primo approccio al codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top