Include l’ordine di Entity Framework

Sto cercando di ottenere qualcosa come il seguente per funzionare:

_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()) 

MODIFICARE:

Dopo un’ulteriore osservazione,

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

ha fatto il lavoro per me (dopo l’iniziale chiamata Factory e senza Children.OrderBy ).

Sembra che tu non possa ordinare la collezione bambini nella tua query. O si ordinano dopo la query o caricano i figli in una seconda query.

Domanda e risposta simili qui

Il metodo di estensione Include è un semplice wrapper attorno a DbQuery.Include . Internamente non esegue le espressioni ma le analizza solo, cioè prende le espressioni dei membri e le converte in un percorso come stringa. Il percorso viene utilizzato come input per DbQuery.Include .

È stato richiesto in precedenza di migliorare la funzionalità di Include , ad esempio per consentire raccolte parzialmente caricate includendo una clausola Where . L’ordine potrebbe essere un’altra richiesta di modifica. Ma come vedete, a causa del funzionamento interno di Include l’intero meccanismo dovrà essere riprogettato per implementare tali miglioramenti. Non lo vedo sulla mappa attuale , quindi potrebbe volerci un po ‘…

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

Generalmente, se stai utilizzando un sacco di include, è perché devi accedere alle proprietà figlio in una vista. Quello che faccio è ordinare la collezione bambino quando ho bisogno di accedervi in ​​una vista.

Ad esempio, potrei creare alcune istruzioni Includi per un modulo principale / dettagli. Non ha senso ordinarlo alla query EF iniziale. Invece, perché non ordinare questi record figlio a livello di vista quando stai effettivamente accedendoli?

Potrei avere un sondaggio con più domande del sondaggio. Se voglio presentare le domande in un particolare ordine, lo faccio a livello di vista parziale quando sto passando la collezione figlio del modello alla vista parziale.

 @Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => x.QuestionId)) 

Non devi convertire un tipo IQueryable in IEnumerable e chiamare Include perché Include non è supportato dal tipo IEnumerable .

In breve, non chiamare mai Include after ToList

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