Func<TObject, bool> è un delegato
Expression<Func<TObject, bool>> sono espressioni
L'espressione diventerà un delegato dopo la compilazione prima di poter essere eseguita. Come cosa
Expression<Func<int, bool>> ex = x=>x < 100;
Func<int, bool> func = ex. Compile();
Poi puoi chiamare func:
func(5) //-restituisce vero
func(200) //- restituisce false
Le espressioni non possono essere chiamate direttamente.
Caso:Un codice di query errato causa una query completa della tabella del database。
Il codice di errore è il seguente:
Passare una variabile di tipo Func come argomento al metodo Count,EF interroga tutti i dati dell'intera tabella e li filtra dalla memoria。 L'istruzione SQL generata appare così:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Esecuzione di DbCommand (8ms) [Parametri=[], CommandType='Text', CommandTimeout='30'] SELECT [c]. [id], [c]. [client_type], [c]. [status], [c]. [inquilino] DA [tabella] COME [c] Il codice corretto è il seguente:
La scrittura corretta aggiunge una condizione where dal database e poi restituisce direttamente il valore del conteggio。 L'istruzione SQL generata appare così:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Esecuzione di DbCommand (4ms) [Parametri=[], CommandType='Text', CommandTimeout='30'] SELECT COUNT(*) DA [tabella] COME [c] DOVE [c]. [client_type] = 1
Utilizzando le chiamate delegate Func sonoSystem.Linq.EnumerableConteggio qui sotto
L'espressione chiamata con Expression<Func<T, bool>> èSystem.Linq.QueryableConteggio qui sotto
(Fine)
|