Ho esaminato la mia domanda e ci sono momenti in cui solo una parte di IQueryable
viene effettivamente tradotta in una query SQL e il resto del lavoro viene eseguito in memoria.
Capisco che non c'è modo per il team EF di tenere conto di tutte le possibili espressioni che uno sviluppatore potrebbe inventare e tradurre magicamente in una query SQL utilizzabile, ma IIRC, EF genererebbe un'eccezione se non fosse in grado di tradurre TUTTA la operazioni definite in un IQueryable
in SQL.
C'è un modo per far sì che l'EF Core generi un'eccezione o, per lo meno, generare un evento quando non è in grado di tradurre completamente un IQueryable
in SQL?
C'è un modo per far sì che l'EF Core generi un'eccezione o, per lo meno, generare un evento quando non è in grado di tradurre completamente un
IQueryable
in SQL?
Sicuro. Innanzitutto, questo è un concetto di EF Core chiamato valutazione del cliente che non esisteva in EF EF Core (EF6.x). È coperto dall'argomento Documentazione Client vs. Server Evaluation e Disabilitazione della sezione di valutazione del client spiega il comportamento predefinito e come può essere modificato:
Per impostazione predefinita, EF Core registra un avviso quando viene eseguita la valutazione del client. Vedere Registrazione per ulteriori informazioni sulla visualizzazione dell'output di registrazione. È possibile modificare il comportamento quando si verifica la valutazione del cliente per lanciare o non fare nulla. Questo viene fatto quando si impostano le opzioni per il proprio contesto, in genere in
DbContext.OnConfiguring
o inStartup.cs
se si utilizza ASP.NET Core.
La versione successiva viene ottenuta utilizzando il metodo ConfigureWarnings
della classe DbContextOptionsBuilder
per RelationalEventId.QueryClientEvaluationWarning
. Le azioni valide sono Log
(default), Ignore
e Throw
(desiderato):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// ...
optionsBuilder.ConfigureWarnings(warnings =>
warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
}