Ho bisogno di ottenere la quantità di record con un determinato filtro.
In teoria questa istruzione:
_dbContext.People.Count (w => w.Type == 1);
Dovrebbe generare SQL come:
Select count (*)
from People
Where Type = 1
Tuttavia, l'SQL generato è:
Select Id, Name, Type, DateCreated, DateLastUpdate, Address
from People
Where Type = 1
La query generata richiede molto più tempo per essere eseguita in un database con molti record.
Devo generare la prima query.
Se faccio solo questo:
_dbContext.People.Count ();
Entity Framework genera la seguente query:
Select count (*)
from People
.. che funziona molto velocemente.
Come generare questa seconda query passando i criteri di ricerca al conteggio?
Non c'è molto da rispondere qui. Se il tuo strumento ORM non produce la query SQL prevista da una semplice query LINQ, non puoi in alcun modo farlo riscrivendo la query (e non dovresti farlo in primo luogo).
EF Core ha un concetto di valutazione mista client / database nelle query LINQ che consente loro di rilasciare versioni EF Core con elaborazione delle query incompleta / molto inefficiente come nel tuo caso.
Estratto da Funzionalità non presenti in EF Core (notare la parola non ) e Roadmap :
Traduzione migliorata per consentire l'esecuzione di più query con esito positivo, con più logica valutata nel database (anziché in memoria).
A breve, stanno pianificando di migliorare l'elaborazione delle query, ma non sappiamo quando accadrà e quale livello di laurea (ricordare che la modalità mista consente loro di considerare la query "funzionante").
Quindi quali sono le opzioni?
Ad esempio, sia in v1.0.1 che in v1.1.0 la query genera l'SQL previsto (testato), in modo da poter semplicemente aggiornare e il problema concreto sarà risolto.
Ma nota che insieme ai miglioramenti le nuove versioni introducono bug / regressioni (come puoi vedere qui EFCore che restituisce troppe colonne per un semplice join LEFT OUTER per esempio), quindi fallo a tuo rischio (e considera di nuovo la prima opzione, cioè Qual è quello giusto per te :)