Condividi tramite


Funzionamento delle query

Entity Framework Core usa LINQ (Language Integrated Query) per eseguire query sui dati dal database. LINQ consente di usare C# (o il linguaggio .NET preferito) per scrivere query fortemente tipate in base al contesto derivato e alle classi di entità.

Annotazioni

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.

Il ciclo di vita di una query

La descrizione seguente è una panoramica generale del processo attraverso cui passa 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 questa elaborazione non debba essere eseguita ogni volta che viene eseguita la 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 tal caso, 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 chiami gli operatori LINQ, stai semplicemente costruendo una rappresentazione in memoria della query. La query viene inviata al database solo quando vengono utilizzati i risultati.

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

  • Iterare i risultati in un ciclo for
  • Uso di un operatore come ToList, ToArray, Single, Count, o gli overload asincroni equivalenti

Avviso

Convalida sempre l'input dell'utente: Anche se EF Core protegge dagli attacchi SQL injection usando 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. Sono inclusi tutti gli input utente usati per costruire in modo dinamico le query. Anche quando si usa LINQ, se si accetta l'input dell'utente per compilare espressioni, è necessario assicurarsi che sia possibile costruire solo le espressioni desiderate.