Recentemente ho esaminato le prestazioni della mia app Web e ho trovato alcune query LINQ che non sono sicuro che la loro modifica migliorerebbe le prestazioni.
Fondamentalmente il codice attuale assomiglia a:
var result = _carsRepository.GetAll()
.Where(x => x.Name == input.Name)
.FirstOrDefault();
if (result != null)
{
throw new Exception("test");
}
Sto pensando di cambiarlo in:
var result = _carsRepository.GetAll()
.Where(x => x.Name == input.Name)
.Any();
if (result)
{
throw new Exception("test");
}
A mio avviso, la prima query restituirebbe un'entità reale, di cui non ho bisogno perché voglio solo sapere se il record con lo stesso nome esiste già nel database. La seconda query restituisce solo un bool.
Sarei grato per qualsiasi commento.
EDIT: potrei essere in esecuzione la query sul contesto db EF, quindi per favore ignoralo. Il repository attuale è un Abp.Domian.Repository generico. GetAll () restituisce IQueryable
Non sono sicuro di cosa GetAll()
. Se sposta tutti gli elementi dal database alla memoria locale, non mi preoccuperei di provare a migliorare questa affermazione. Perché prendi tutti gli oggetti se ti serve solo il primo.
Se GetAll()
restituisce un IQueryable<...>
, allora c'è una leggera differenza:
FirstOrDefault()
cambierà l'espressione nella query, in modo tale che l'istruzione SQL sarà Select top 1 ... from
.
Dopo aver modificato l'espressione, chiederà al Provider
IQqueryable
di eseguire l' Expression
, il risultato completo IQqueryable
SQL verrà trasferito alla memoria locale, che in questo caso sarà un elemento.
Any()
quasi farà lo stesso, tranne che l'SQL sarà: Select top 1 1 from ...
È facile vedere che un Select top 1 1
trasferirà al massimo un intero, mentre Select top 1
trasferirà tutte le colonne selezionate.
Quindi, se vuoi solo controllare se ci sono elementi, Any()
è più efficiente di FirstOrDefault
Ci potrebbe essere una leggera differenza a causa di
.FirstOrDefault()
- Legge tutte le colonne
.Any()
- Basta controllare se ci sono voci
La differenza si baserà principalmente sulla dimensione dei dati e sulla struttura SQL, sugli indici e su tutti. Consiglia di confrontarli testando