Caste ActiveRecord - query ottimizzata LINQ
-
05-07-2019 - |
Domanda
Uso Castle ActiveRecord come livello di persistenza.
Ho ottenuto queste funzioni che devono restituire i primi 20 utenti dal database.
IList<User> users = new List<User>();
var userQuery = from u in User.FindAll()
orderby u.CreationDate
select u;
return userQuery.Take(20).ToList();
Nel mio database, al momento ho 100 utenti, voglio solo che la mia query restituisca 20 utenti e non 100.
Quando controllo cosa sta succedendo con log4net, vedo che la query ottiene prima 100 utenti e, successivamente, prende solo i 20 primi.
Vorrei sapere se esiste un modo migliore per farlo. Perché più utenti avrò, più la mia query sarà lenta e non ottimizzata ...
Soluzione
Questo è ciò che accade ..
- Il metodo User.FindAll () restituisce un array di tutti gli utenti. (100 righe dal DB)
- Quindi ordini e filtra lo stesso array.
Con AR 2.0 puoi usare ActiveRecordLinqBase invece di ActiveRecordBase e utilizzare invece .Queryable se .FindAll ().
Questa query restituirà solo i 20 record dal database.
var userQuery = (from u in User.Queryable
orderby u.CreationDate
select u).Take(20).ToList();
Altri suggerimenti
Crea una query HQL personalizzata con " SetMaxResults " metodo. Consulta la Guida per l'utente di ActiveRecord per un esempio.