2013-03-13 2 views
24

io sto cercando di ottenere qualcosa di simile a quanto segue per lavorare:Entity Framework ordinazione Include

_dbmsParentSections = FactoryTools.Factory.PdfSections 
         .Include(x => x.Children.OrderBy(y => y.Order).ToList()) 
         .Include(x => x.Hint).Include(x => x.Fields) 
         .Where(x => x.FormId == FormId && x.Parent == null) 
         .OrderBy(o => o.Order) 
         .ToList(); 

La parte che causa l'eccezione è:

.Include(x => x.Children.OrderBy(y => y.Order).ToList()) 

EDIT:

Upon ulteriore osservazione,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList()); 

ha svolto il lavoro per me (dopo la chiamata iniziale Factory e senza Children.OrderBy).

+0

Grazie per fornire la risposta che hai trovato lavorato per me partecipavano – Ronan

risposta

26

Sembra che non sia possibile ordinare la raccolta figli nella query. Ordinare dopo la query o caricare i bambini in una seconda query.

interrogazione e risposta here

+0

ti ho dato il credito perché eri il primo a rispondere e tutte e tre le risposte più o meno Dì la stessa cosa –

+0

Questo è ancora vero con EF versione 6.0? – Brad8118

1

questo funzionerà mai gona. L'inclusione di EF è cercare di capire e tradurre tutto in SQL, ma tu vuoi molto da questo. Carica tutte le entità senza ordinamento e .ToList() - ing e scrivi un metodo di estensione per IEnumerable per ottenere un risultato ordinato.

11

Il metodo di estensione Include è un semplice wrapper attorno a DbQuery.Include. Internamente non è execute le espressioni ma solo parsès loro, cioè prende le loro espressioni membro e le converte in un percorso come stringa. Il percorso viene utilizzato come input per DbQuery.Include.

È stato richiesto in precedenza per migliorare la funzionalità di Include, ad es. per consentire raccolte parzialmente caricate includendo una clausola Where. L'ordine potrebbe essere un'altra richiesta di modifica. Tuttavia, come si vede, a causa del funzionamento interno di Include, l'intero meccanismo dovrà essere riprogettato per implementare tali miglioramenti. Io non lo vedo sulla corrente road map quindi potrebbe richiedere un po '...

-2

non si deve convertire un tipo IQueryable a IEnumerable e chiamare Include perché Include non è supportato da IEnumerable tipo.

Insomma, mai chiamata Includere dopo ToList

IQueryable = server side call (SQL) 
IEnumerable = client side (loaded in memory) 
+0

Il tuo punto è vero, ma non ha nulla a che fare con la domanda che viene posta. Sto provando a fare il 'Include' prima di' ToList' –