Una delle funzionalità di EF6 è la capacità di eseguire query SQL e restituire oggetti che non devono obbligatoriamente essere mappati nel DbContext. Questa funzionalità non è stata portata su Entity Framework Core complicando i percorsi di migrazione da EF6 a EF Core in quanto, in EF Core, l'entity va sempre mappata sul DbContext. A partire dalla versione 8, EF Core colma questo gap e permette di eseguire comandi custom verso il database (query SQL, chiamate a stored procedure o funzioni e così via) e di restituire oggetti non mappati.
Poiché decidiamo di utilizzare oggetti non mappati nel contesto non abbiamo a disposizione un DbSet e il contesto lo usiamo solamente per lanciare la query. Questo viene fatto attraverso il metodo SqlQuery<T> esposto dalla proprietà Database del DbContext come mostrato nel prossimo esempio.
public class CustomerWithOrder { public int CustomerId { get; set; } public string Name { get; set; } public int Orders { get; set; } } var cwo = await context.Database .SqlQuery<CustomerWithOrder>("select CustomerId, Name, Count(*) as Orders .... ") .ToListAsync();
Il mapping tra le colonne restituite dalla query e le proprietà degli oggetti viene fatto per nome, ma possiamo personalizzare questo comportamento attraverso le data annotation. Ad esempio potremmo fare che la proprietà Orders sia mappata con la colonna Count
public class CustomerWithOrder { public int CustomerId { get; set; } public string Name { get; set; } [Column("Count")] public int Orders { get; set; } } var cwo = await context.Database .SqlQuery<CustomerWithOrder>("select CustomerId, Name, Count(*) as Count .... ") .ToListAsync();
Possiamo inoltre utilizzare costruttori esattamente come faremmo per una qualuqnue entity restituita da una query LINQ.
public class CustomerWithOrder { public CustomerWithOrder(int customerId) { CustomerId = customerId; } public int CustomerId { get; set; } public string Name { get; set; } public int Orders { get; set; } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ordinare randomicamente una lista in C#
Migliorare l'organizzazione delle risorse con Azure Policy
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Recuperare App Service cancellati su Azure
Gestione dei nomi con le regole @layer in CSS
Integrare SQL Server in un progetto .NET Aspire
Creare una libreria CSS universale: Nav menu
Recuperare l'ultima versione di una release di GitHub
Simulare Azure Cosmos DB in locale con Docker
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Gestione degli eventi nei Web component HTML
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
I più letti di oggi
- Utilizzare il pattern matching per semplificare le espressioni
- Utilizzare requestAnimationFrame per animazioni fluide
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare WebJobs su Linux con Azure App Service
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!