Eseguire query in contemporanea con EF

di Stefano Mostarda, in LINQ, Entity Framework,

Uno dei limiti principali di EF (e di altri O/RM) è quello di non permettere l'esecuzione di più comandi in contemporanea pena il sollevamento di un'eccezione.
Esistono tuttavia molti casi in cui eseguire query in simultanea è necessario per ottimizzare le prestazioni. Pensiamo ad una dashboard dove ogni box è popolato con dati provenienti da una query diversa. In questi casi poter eseguire le query in contemporanea ottimizza parecchio le prestazioni rispetto a un'esecuzione sequenziale delle query.
Non potendo superare la limitazione di EF, dobbiamo ricorrere a un altra tecnica per eseguire le query: creare più istanze del contesto. Quando ci troviamo in una situazione dove il contesto viene passato nel costruttore, questa soluzione non sembra praticabile. Tuttavia, possiamo fare una cosa diversa: iniettare IServiceProvider e tramite questo creare uno scope di dependency injection per ogni contesto da usare. In questo modo avremo tanti contesti quante le query e ognuno può eseguire una query in contemporanea.

public class Manager(IServiceProvider sp)
{
  public async Task ExecuteQueries()
  {
    var tasks = new Task[2];
    using var s1 = sp.CreateScope();
    using var s2 = sp.CreateScope();
    var ctx1 = s1.ServiceProvider.GetRequiredService<MyContext>();
    var ctx2 = s2.ServiceProvider.GetRequiredService<MyContext>();
    tasks[0] = ctx1.People.Where(c => c.Cognome.StartsWith("A")).ToListAsync();
    tasks[1] = ctx2.People.Where(c => c.Age < 18).ToListAsync();
    await Task.WhenAll(tasks);
    //process results
  }
}

Con questa tecnica, il codice da scrivere aumenta notevolmente rispetto a un approccio sequenziale. Per questo motivo, se ne suggerisce l'uso solo li dove effettivamente le performance siano una necessità irrinunciabile.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi