Func<TObject, bool> este un delegat
Expression<Func<TObject, bool>> sunt expresii
Expresia va deveni delegat după compilare înainte de a putea fi rulată. Cum ar fi
Expression<Func<int, bool>> ex = x=>x < 100;
Func<int, bool> func = ex. Compile();
Atunci poți numi func:
func(5) //-returnează adevărat
func(200) //- returnează false
Expresiile nu pot fi chemate direct.
Caz:Un cod de interogare incorect determină o interogare completă a tabelului bazei de date。
Codul de eroare este următorul:
Trece o variabilă de tip Func ca argument către metoda Count,EF interoghează toate datele din întregul tabel și le filtrează din memorie。 Instrucțiunea SQL generată arată astfel:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Executat DbCommand (8ms) [Parametri=[], CommandType='Text', CommandTimeout='30'] SELECT [c]. [id], [c]. [client_type], [c]. [status], [c]. [chiriaș] DE la [tabel] CA [c] Codul corect este următorul:
Scrierea corectă adaugă o condiție where din baza de date și apoi returnează direct valoarea numărului。 Instrucțiunea SQL generată arată astfel:
info: Microsoft.EntityFrameworkCore.Database.Command[20101] Executat DbCommand (4ms) [Parametri=[], CommandType='Text', CommandTimeout='30'] SELECT COUNT(*) DE la [tabel] CA [c] UNDE [c]. [client_type] = 1
Folosind apelurile delegate Func suntSystem.Linq.EnumerableNumărătoarea de mai jos
Expresia numită cu Expression<Func<T, bool>> esteSystem.Linq.QueryableNumărătoarea de mai jos
(Sfârșit)
|