Func<TObject, bool> är en delegat
Expression<Func<TObject, bool>> är uttryck
Uttrycket blir en delegat efter kompilation innan det kan köras. Som vad
Expression<Func<int, bool>> ex = x=>x < 100;
Func<int, bool> func = ex. Kompilera();
Då kan du anropa func:
func(5) //-återvänder true
func(200) //- returnerar false
Uttryck kan inte anropas direkt.
Fall:Felaktig frågekod orsakar en fullständig tabellfråga i databasen。
Felkoden är följande:
Skicka en variabel av typen Func som argument till Count-metoden,EF frågar all data i hela tabellen och filtrerar den från minnet。 Den genererade SQL-satsen ser ut så här:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Utförd DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] VÄLJ [c]. [id], [c]. [client_type], [c]. [status], [c]. [hyresgäst] FRÅN [tabell] SOM [c] Den korrekta koden är följande:
Den korrekta skrivningen lägger till ett where-villkor från databasen och returnerar sedan värdet av räkningen direkt。 Den genererade SQL-satsen ser ut så här:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Utförd DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] VÄLJ RÄKNING(*) FRÅN [tabell] SOM [c] DÄR [c]. [client_type] = 1
Med Func-delegatanrop ärSystem.Linq.EnumerableRäkna nedan
Uttrycket som kallas med Expression<Func<T, bool>> ärSystem.Linq.QueryableRäkna nedan
(Slut)
|