Nello script #519 abbiamo visto come creare un interceptor e come utilizzarlo per loggare le chiamate fatte al database. Questo è un possibile uso degli interceptor ma ce ne sono molti altri. Un esempio è dato dalla possibilità di dare degli hint a SqlServer su come eseguire una query. A volte abbiamo infatti la necessità di specificare a SQL Server quale indice usare o meno perchè il suo meccanismo interno non riesce a prendere una decisione corretta. In questo esempio specificheremo a SQL Server di non usare il query plan in cache ma di ricalcolarlo ogni volta.
Come primo step dobbiamo marcare la query con un tag che ci permetta di riconoscere questo tag all'interno del codice SQL Generato.
Context.People .TagWith("Recompile") .Where(c => c.BirthDate > 2000) .ToList()
Il secondo passo consiste nel creare l'interceptor, verificare se nel codice SQL generato per una query ci sia il tag e in caso positivo aggiungere al codice SQL la clausola option(recompile). In questo esempio mostriamo il codice del metodo ReaderExecuting ma lo stesso concetto si applica a tutti i metodi di lettura.
public class MyCommandInterceptor : DbCommandInterceptor { public override InterceptionResult ReaderExecuting( DbCommand command, CommandEventData eventData, InterceptionResult result) { var sql = command.CommandText; if (sql.contains("--Recompile")) { command.CommandText += " option(recompile)" } return result; } }
Il terzo è ultimo step consiste nel configurare l'interceptor in fase di startup.
services.AddDbContext(options => options .UseSqlServer(connectionString) .AddInterceptors(new MyCommandInterceptor()));
Questo esempio dimostra come la combinazione tag/interceptor possa permetterci di ottenere funzionalità molto potenti.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare database e servizi con gli add-on di Container App
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Gestione dell'annidamento delle regole dei layer in CSS
Ordine e importanza per @layer in CSS
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
C# 12: Cosa c'è di nuovo e interessante
Eseguire una query su SQL Azure tramite un workflow di GitHub
Utilizzare Tailwind CSS all'interno di React: primi componenti
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework