Func<TObject, bool> je delegát
Expression<Func<TObject, bool>> sú výrazy
Expression sa po kompilácii stane delegátom, kým ho nemožno spustiť. Ako čo
Expression<Func<int, bool>> ex = x=>x < 100;
Func<int, bool> func = ex. Compile();
Potom môžete volať func:
func(5) //-vracia pravdivosť
func(200) //- vracia false
Výrazy nie je možné volať priamo.
Prípad:Nesprávny kód dotazu spôsobuje úplný tabuľkový dotaz databázy。
Chybový kód je nasledovný:
Prejdite premennú typu Func ako argument do metódy Count,EF dotazuje všetky údaje v celej tabuľke a filtruje ich z pamäte。 Generovaný SQL príkaz vyzerá takto:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Vykonaný DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] VYBRAŤ [c]. [id], [c]. [client_type], [c]. [stav], [c]. [nájomca] Z [stola] AS [c] Správny kód je nasledovný:
Správne napísanie pridá podmienku where z databázy a potom vráti hodnotu počtu priamo。 Generovaný SQL príkaz vyzerá takto:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Vykonaný DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] VYBERTE COUNT(*) Z [stola] AS [c] KDE [c]. [client_type] = 1
Pomocou Func delegátov volaní súSystem.Linq.EnumerablePočet nižšie
Výraz nazývaný Expression<Func<T, bool>> jeSystem.Linq.QueryablePočet nižšie
(Koniec)
|