2009-11-26 4 views
0

J'utilise Castle ActiveRecord comme couche de persistance.Caste ActiveRecord - requête optimisée LINQ

J'ai obtenu ces fonctions qui doivent retourner les 20 premiers utilisateurs de la base de données.

IList<User> users = new List<User>(); 

var userQuery = from u in User.FindAll() 
       orderby u.CreationDate 
       select u; 

return userQuery.Take(20).ToList(); 

Dans ma base de données, j'ai actuellement 100 utilisateurs, je veux seulement que mon retour de requête 20 utilisateurs et non pas 100.

Quand je surveille ce qui se passe avec log4net, je vois que la première requête pour obtenir 100 utilisateurs et après, seulement prendre les 20 premières.

Je voudrais savoir si c'est là une meilleure façon de le faire. Parce que plus j'aurai d'utilisateurs, plus ma requête sera lente et non optimisée ...

+0

Je suppose que les requêtes que vous voyez ici sont d'abord une requête que la récupération id et la requête pour obtenir les 20 entités ? Pouvez-vous publier les requêtes à partir de log4net? –

Répondre

3

C'est ce qui se passe ..

  1. La méthode User.FindAll() retourne un tableau de tous les utilisateurs. (100 lignes de la base de données)
  2. Ensuite, vous commandez et filtrez ce même tableau.

Avec AR 2.0 vous pouvez utiliser ActiveRecordLinqBase au lieu de ActiveRecordBase et utiliser .Queryable au lieu si .FindAll().

Cette requête renverra uniquement les 20 enregistrements de la base de données ..

var userQuery = (from u in User.Queryable 
       orderby u.CreationDate 
       select u).Take(20).ToList(); 
+0

il semble être exactement ce que je veux! Mais maintenant, j'ai cette erreur: System.ObjectDisposedException: La session est fermée! Une idée de comment je peux résoudre ça? – Melursus

+0

Courez-vous votre requête dans une portée de session? Lors de l'utilisation de ActiveRecord.Linq, un SessionScope est requis. using (new SessionScope()) {votre code Linq ...} –

+0

Existe-t-il un moyen de définir une sorte de Session-Scope par défaut? Parce que je n'aime pas vraiment l'idée de mettre une utilisation qui enveloppe tout mon code linq .. – Melursus