2009-09-11 13 views
9

Ho una tabella di riferimento automatico standard di Categories. Nel mio modello di entità ho creato associazioni Children e Parent. È possibile caricare l'intero oggetto Category senza caricare lentamente?Eager carica una tabella autoreferenziale

se utilizzo il codice di seguito, carica 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 sono già stati caricati tutti gli oggetti di categoria?

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

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

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

risposta

1

No, non è possibile. Considera: tutte le query LINQ to Entities sono tradotte in SQL. Quale istruzione SQL include una profondità illimitata in una gerarchia autoreferenziale? Nell'SQL standard, non ce n'è uno. Se c'è un'estensione per questo in T-SQL, non so cosa sia, e non credo che neanche i fornitori di EF lo facciano.

+1

Ma se eseguo la query "SELECT * FROM Categories" ho caricato tutta la tabella e inoltre ho caricato tutte le categorie padre e figlio, perché sono tutte in una tabella. Quindi in questo caso non è molto complicato assegnare questi record caricati alle proprietà referenziate o no? –

+1

Se in realtà è stata ripetuta l'intera tabella, tutti gli oggetti * dovrebbero * essere in memoria e * sarebbe * già stato risolto, con o senza Include. Ma ciò non accadrà finché non avrai raggiunto l'ultimo record sul tavolo. Includi garanzie che gli oggetti correlati saranno lì sul * primo * record che iterate. –

+3

"Quale istruzione SQL include una profondità illimitata in una gerarchia autoreferenziale?" -> Common Table Expressions in T-SQL –

1

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

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

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

C'è una spiegazione migliore qui how-does-entity-framework-work-with-recursive-hierarchies-include-seems-not-to.

+0

Conosco questo metodo (genererà hundrets delle query T-SQL), ma anche io lo caricherò senza tracciamento, perché lo sto salvando nella cache. Sto cercando qualcos'altro. Se carico un'intera tabella di categorie, ho caricato anche categorie di genitori e figli, ma le proprietà dell'associazione non vengono caricate. Inoltre ho tabella correlata di CategoryType e lo sto caricando per ogni categoria, indipendentemente dal fatto che abbiano fatto riferimento alla stessa riga ... –

+0

Ok, non ho visto che devi metterlo nella cache. Hmm, proverò a pensare a come questo potrebbe essere risolto. –

Problemi correlati