"sarà in primo luogo selezionare tutte le righe del database e quindi trovare quello"
Tecnicamente, no, la combinazione di .Selezionare seguita da .SingleOrDefault volontà non farlo. Select() imposta i parametri per la query, ma in realtà non recupera alcun dato. L'esecuzione posticipata di LINQ non recupera alcuna riga finché qualcosa non deve effettivamente produrre un risultato di dati. È possibile comporre più query insieme (.Seleziona (...). Selezionare (..) ecc. E niente recupera effettivamente alcuna riga finché non si esegue un'operazione che restituisce dati, come Primo() o. Lista().
Tuttavia, l'uso di Single() può comportare la scansione dell'intero set di dati per dimostrare che l'unica riga corrispondente è la riga corrispondente.
Pensateci: come farà la query sa che quella riga è l'unica riga nel set di dati che corrisponde? Dovrà cercare di trovare la riga successiva. Se c'è davvero solo una riga che corrisponde a milioni nel set di dati, Single() potrebbe dover scorrere tutti quei milioni di righe per dimostrare che la corrispondenza corrente è l'unica e unica corrispondenza.
Se il set di dati è SQL ei dati sono indicizzati in modo da consentire l'ottimizzazione delle query, Single() potrebbe non essere così male. Ma se i tuoi dati SQL non sono indicizzati in modo utile a questa query, Single() potrebbe creare molto lavoro per il server SQL.
Single() è appropriato se la logica del programma ha realmente bisogno di sapere che la riga restituita è l'unica riga dell'intero set di dati. Tuttavia, ci sono altri modi per garantire unicità. Se puoi impostare una chiave primaria sui tuoi dati che corrisponde alla tua condizione LINQ, solo una riga corrispondente può esistere/essere aggiunta al database per cominciare, quindi non hai davvero bisogno di Single(). (E ironicamente, anche le prestazioni di Single() saranno banali in questo caso perché l'indice della chiave primaria può essere utilizzato per ottimizzare la query)
Se si desidera solo la prima riga che corrisponde alla condizione, utilizzare Primo () invece di Single(). First() deve solo analizzare le righe di dati fino a quando non trova la prima corrispondenza. Non è necessario continuare la scansione delle righe per dimostrare che la prima corrispondenza è l'unica corrispondenza, come Single().
Grazie. Ho usato firstordefault ma quando ho fatto la domanda in qualche modo ho dimenticato. –
Stavo per suggerire anche FirstOrDefault(). –