Funzionamento delle query

Entity Framework Core usa query LINQ (Language Integrated Query) per eseguire query sui dati dal database. Le query LINQ consentono di usare C#, o il linguaggio .NET che si preferisce, per generare query fortemente tipizzate in base alle classi di contesto ed entità derivate.

Nota

Questo articolo non è aggiornato e alcune parti di esso devono essere aggiornate per tenere conto delle modifiche apportate nella progettazione della pipeline di query. Se avete dubbi su qualsiasi comportamento menzionato qui, si prega di porre una domanda.

Ciclo di vita di una query

La descrizione seguente è una panoramica generale del processo eseguito da ogni query.

  1. La query LINQ viene elaborata da Entity Framework Core per compilare una rappresentazione pronta per l'elaborazione da parte del provider di database
    1. Il risultato viene memorizzato nella cache in modo che tale elaborazione non debba essere ripetuta per ogni esecuzione della query
  2. Il risultato viene passato al provider di database
    1. Il provider di database identifica le parti della query che possono essere valutate nel database
    2. Queste parti della query vengono convertite in un linguaggio di query specifico del database (ad esempio, SQL per un database relazionale)
    3. Viene inviata una query al database e il set di risultati restituito (i risultati sono valori del database, non delle istanze di entità)
  3. Per ogni elemento nel set di risultati
    1. Se la query è una query di rilevamento, Entity Framework controlla se i dati rappresentano già un'entità nello strumento di rilevamento delle modifiche per l'istanza di contesto
      • In caso affermativo, viene restituita l'entità esistente
      • In caso contrario, viene creata una nuova entità, viene configurato il rilevamento delle modifiche e viene restituita la nuova entità
    2. Se la query è una query senza rilevamento, viene sempre creata e restituita una nuova entità

Quando vengono eseguite le query

Quando si chiamano operatori LINQ, è sufficiente creare una rappresentazione in memoria della query. La query viene inviata al database solo al momento dell'utilizzo dei risultati.

Le operazioni più comuni che causano l'invio della query al database sono:

  • Iterazione dei risultati in un ciclo for
  • Uso di un operatore come ToList, ToArraySingle, Count, o gli overload asincroni equivalenti

Avviso

Convalidare sempre l'input dell'utente: anche se EF Core offre protezione da attacchi SQL injection tramite l'uso di parametri e valori letterali di escape nelle query, non convalida gli input. La convalida appropriata, in base ai requisiti dell'applicazione, deve essere eseguita prima che i valori delle origini non attendibili vengano usati nelle query LINQ, assegnate alle proprietà dell'entità o passate ad altre API di EF Core. Ciò include qualsiasi input dell'utente usato per costruire query in modo dinamico. Anche quando si usa LINQ, se si accetta l'input dell'utente per la creazione delle espressioni, è necessario assicurarsi che possano essere costruite solo le espressioni previste.