Qual è la differenza quando si eseguono query sui dati dal contesto usando Find()
e Single()
. Entrambi restituiscono l'entità richiesta.
Alcuni esempi che ho trovato su Microsoft utilizzano la variante Single
, SingleOrDefault
per eseguire query per entità. Alcuni usano il metodo Find
.
Ci sono vantaggi "prestazionali" quando si usano l'uno rispetto all'altro?
Anche se sembrano uguali, sono molto diversi in alcuni modi fondamentali
In breve, Find
inizia cercando nella cache locale del contesto. Se non viene trovata alcuna corrispondenza, invia una query al db.
La documentazione è tua amica
Trova un'entità con i valori chiave primaria indicati. Se nel contesto esiste un'entità con i valori della chiave primaria specificati, viene restituita immediatamente senza effettuare una richiesta al negozio. In caso contrario, viene presentata una richiesta al negozio per un'entità con i valori chiave primaria indicati e questa entità, se trovata, viene allegata al contesto e restituita. Se non viene trovata alcuna entità nel contesto o nel negozio, viene restituito null.
Metodo Queryable.SingleOrDefault
Restituisce un singolo elemento specifico di una sequenza o un valore predefinito se non viene trovato tale elemento.
Metodo Queryable.FirstOrDefault
Restituisce il primo elemento di una sequenza o un valore predefinito se non viene trovato alcun elemento.
Altro-così
Interrogazione e ricerca di entità
Il metodo Find su DbSet utilizza il valore della chiave primaria per tentare di trovare un'entità tracciata dal contesto. Se l'entità non viene trovata nel contesto, verrà inviata una query al database per trovare l'entità lì. Viene restituito null se l'entità non viene trovata nel contesto o nel database.
Trova è diverso dall'uso di una query in due modi significativi:
- Un round trip per il database verrà effettuato solo se l'entità con la chiave specificata non viene trovata nel contesto.
- Trova restituirà entità che si trovano nello stato Aggiunto. In altre parole, Trova restituirà le entità che sono state aggiunte al contesto ma che non sono state ancora salvate nel database.
Aggiornare
Ciò significa che se l'entità fosse già tracciata (tramite caricamento lento), allora Find avrebbe effettivamente un vantaggio in termini di prestazioni migliori quando si tenta di eseguire nuovamente le query?
Sì, avrà prestazioni migliori