Entity Framework 5+ deve precompilare tutte le query. Tuttavia, per le query comeEntity Framework: query precompilata per Enumerable.Contains
List<Guid> ids;
var entities = context.MyEntities.Where(x => ids.Contains(x.Id)).ToArray();
Entity Framework non può precompilare l'interrogazione, e in funzione della complessità della query generale, l'analisi della struttura di espressione SQL può consumare diversi secondi. Qualcuno ha trovato una soluzione alternativa per ottenere comunque una query precompilata? Non capisco davvero perché sarebbe così difficile; naturalmente è difficile da fare con paramters, dal momento che il numero di elementi possono differire, ma sarebbe sufficiente avere SQL come
SELECT a, b, c from MyEntities
WHERE c in __PLACEHOLDER__
e quindi di sostituire il segnaposto con gli elementi della lista effettivi. Ovviamente, non è bello come passare i parametri, ma sarebbe di gran lunga meglio che aspettare i secondi per analizzare l'intero albero delle espressioni più e più volte.
Le liste non possono essere utilizzate come parametri in modo tale da fare ciò che suggerisci che è che costruisce una nuova query perché l'elenco può contenere elementi diversi ogni volta che viene chiamato. Quindi in realtà è una limitazione SQL. –
Non del tutto; come detto, inizia ad analizzare ogni volta l'albero delle espressioni da zero.abbiamo una query con un paio di join che richiede 5 secondi per analizzare (con pochi ms su SQL Server), ecco perché sto cercando una soluzione alternativa. – Roland
@rolandQuanto è grande questa lista? Hai anche da usare contiene? Il problema potrebbe dipendere da quanto tempo ogni voce è ....... solo quanto ha bisogno di confrontare. Ho avuto un problema simile con .StartsWith fino a quando non ho usato StringComparison.Ordinal lì che ha accelerato notevolmente (rispetto a .Contains). Il problema potrebbe essere solo che ha bisogno di scorrere attraverso stringhe troppo grandi (per grandi in termini di tempo richiesto). Se potessi cambiarlo in startswith e ordinal, questo dovrebbe spargere considerevolmente (ma dipende dal tuo caso d'uso esatto). – Thomas