In Entity Framework Core è stato introdotto il concetto di ClientEvaluation. Questa funzionalità rende possibile eseguire query che non possono essere tradotte interamente in SQL. Prendiamo il seguente esempio:
var people = context.People .Select(p => new { p.Id, FullName = CreateFullName(p.FirstName, p.LastName) }) .ToList();
In questi casi, il provider LINQ di Entity Framework non può tradurre il metodo CreateFullName in SQL, quindi esegue il metodo Select in memoria. Questo comporta che l'intera Entity viene scaricata dal database anche se solo alcuni dati vengono utilizzati con ovvie conseguenze negative sull'utilizzo delle risorse.
Sebbene con il metodo Select il problema possa essere limitato, con il metodo Where il problema esplode:
var people = context.People .Where(p => CreateFullName(p.FirstName, p.LastName).Contains("mos")) .ToList();
In questo caso, Entity Framework scarica l'intera tabella in memoria e poi esegue la Where in locale. Questo ovviamente ha un impatto negativo in molti casi insostenibile per le performance.
Per ovviare a questi problemi, Entity Framework Core permette di disabilitare la ClientEvaluation in fase di configurazione.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Selettore CSS :has() e i suoi casi d'uso avanzati
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Creare una libreria CSS universale: Clip-path
Scrivere selettori CSS più semplici ed efficienti con :is()
Ottenere un token di accesso per una GitHub App
Escludere alcuni file da GitHub Secret Scanning