Comment optimiser les appels ActiveRecord dans vos applications Web ASP.NET MVC 2?Comment optimiser les appels Castle ActiveRecord
Je suis assis devant mon projet et tout va bien jusqu'à ce que je commence à remplir les données. Comme beaucoup de projets j'ai une structure de données semblable à ceci:
Une planète a beaucoup de pays. Un pays a beaucoup d'états/provinces. Un État a beaucoup de villes. Une ville a beaucoup de quartiers.
Ci-dessous un exemple de château ActiveRecord/NHibernate objet commercial persistant
[ActiveRecord]
public class Country {
[Property]
public String CountryName { get; set; }
[HasMany(typeof(States))]
public IList<State> States { get; set; }
}
Supposons maintenant que vous voulez faire une demande innocente comme obtenir une liste de tous les pays de la planète
Par défaut, ActiveRecord/Nhibernate va charger l'arbre entier, jusqu'à la toute dernière dépendance.
Il peut s'avérer être BEAUCOUP d'appels SQL.
D'accord, nous pouvons résoudre ce avec le chargement paresseux [ActiveRecord(lazy=true)]
mais chaque fois que vous voulez faire quelque chose propre comme ci-dessous
String text = "This country of " + country.CountryName + " has the following states:";
foreach(State s in country.States)
{
text += s.StateName + " ";
}
Avec le activerecord paresseux charge l'attribut à chaque fois qu'il va chercher pour s.StateName il est un autre appel sql .
C'est beaucoup trop d'appels SQL.
Certains de mes amis ont suggéré d'utiliser des méthodes ActiveRecordBase telles que FindAll (critères).
Mais il finit par être vraiment moche et difficile à lire avec tous ces Expression.Eq et quoi d'autre.
Et puis d'autres personnes ont également suggéré d'utiliser quelque chose comme HQL. HQL ressemble beaucoup à SQL. Donc, en bout de ligne, il semble que la manière la plus propre et la plus optimisée consiste à écrire des requêtes SQL simples et simples. Cela va droit au but.
SELECT * FROM Countries //No loading of an entire tree of dependencies
SELECT * FROM States WHERE CountryId = @selectedId //1 call and you have all your states
Quoi qu'il en soit, pour l'instant j'utilise des requêtes SQL et les procédures stockées pour l'extraction de données et ActiveRecord pour enregistrer/supprimer des objets.
Corrigez-moi si je me trompe ...?
Remerciements Apprécié.
L'oeil de Bull! Je vous remercie! – TchiYuan