EF Core supporta l'esecuzione di stored procedure e il mapping dei risultati a un'entità (entità esistenti o entità create appositamente per la stored procedure).
Ho letto molti problemi relativi a questo argomento, ad esempio https://github.com/aspnet/EntityFrameworkCore/issues/1862 https://github.com/aspnet/EntityFrameworkCore/issues/245 .
Ho pensato che # 1862 avrebbe permesso la valutazione del server per le stored procedure che eseguono solo un'operazione SELECT
.
Tuttavia, sembra che il mio codice comporti 2 chiamate al database. C'è un modo per eseguire il seguente codice con una singola chiamata al database?
var customIdsQuery = _dbContext.Set<CustomId>()
.FromSql($"dbo.GetCustomIDs {username}").AsNoTracking();
var eventsQuery = _dbContext.Event.Where(ev => ev.User.Username == username)
.Join(customIdsQuery, ev => rev.CustomId, cid=> cid.Id, (ev, cid) => ev).AsNoTracking();
var events = eventsQuery.ToList(); // 2 database calls
Il model builder assomiglia a qualcosa del genere:
modelBuilder.Entity<CustomId>(); // For the stored procedure
modelBuilder.Entity<Event>(entity => // Key is defined as attribute on the model
{
entity.HasOne(d => d.Meeting)
.WithMany(p => p.Event)
.HasForeignKey(d => d.MeetingId);
entity.HasOne(d => d.User)
.WithMany(p => p.Event)
.HasForeignKey(d => d.UserId);
});
Mi manca qualcosa di ovvio per poter valutare l'intera query sul server SQL? Dalla documentazione ( https://docs.microsoft.com/en-us/ef/core/querying/raw-sql ):
Le istruzioni SELECT passate a questo metodo dovrebbero essere generalmente componibili: Se EF Core deve valutare operatori di query aggiuntivi sul server (ad esempio per tradurre gli operatori LINQ applicati dopo FromSql), l'SQL fornito verrà trattato come una sottoquery
La mia stored procedure è infatti simile a un'istruzione SELECT
, esiste un modo per far sì che venga riconosciuta come tale?
Grazie.
Ho usato invece una funzione con valori di tabella, è componibile dal momento che EFC sa che è di sola lettura.