Mischiare codice server side e client side in una query LINQ con Entity Framework

di Stefano Mostarda, in LINQ, Entity Framework,

Una delle caratteristiche delle prime versioni di Entity Framework Core era la capacità di capire che una query non poteva essere tradotta in sql e quindi scaricare i dati in locale per poi processarli in locale. Sebbene elegante, questa caratteristica presentava un possibile enorme problema di performance. Infatti senza rendersene conto, si potevano scaricare enormi quantità di dati dal database per poi sfruttarne solo una parte.
Con la versione 3 di Entity Framework Core, questa caratteristica è stata eliminata proprio per evitare problemi. Tuttavia, possiamo sempre ripristinarla semplicemente usando il metodo AsEnumerable. Quando usiamo questo metodo, tutto ciò che viene prima viene tradotto in Sql, tutto ciò che viene processato dopo viene invece processato lato client.

private bool LocalFilter(Person c) => c.Name.StartsWith("A");
var x1 = ctx.People
    .Where(c => c.Id < 100)
    .AsEnumerable()
    .Where(LocalFilter)
    .ToList();

In questo snippet, EF esegue i seguenti passi: genera una query sql che recupera tutte le persone che hanno id minore di 100, scarica i dati in locale i dati e poi li processa passandoli alla funzione di filtro che ne esclude altri in base all'inizio del nome.
Questa tecnica è sicuramente elegante, ma bisogna essere consapevoli di quello che si fa altrimenti si rischiano enormi problemi di performance.

Commenti

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

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