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
Hosting di componenti WebAssembly in un'applicazione Blazor static
Routing statico e PreRendering in una Blazor Web App
Installare le Web App site extension tramite una pipeline di Azure DevOps
Criptare la comunicazione con mTLS in Azure Container Apps
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Usare un KeyedService di default in ASP.NET Core 8
Creare alias per tipi generici e tuple in C#
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Potenziare Azure AI Search con la ricerca vettoriale
Usare una container image come runner di GitHub Actions
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON