/ / Meilleure façon d'implémenter des fonctionnalités similaires à lazy = "extra" avec NHibernate 2.0.1 - nhibernate

Meilleure façon d'implémenter des fonctionnalités similaires à lazy = “extra” avec NHibernate 2.0.1 - nhibernate

J'ai une relation à plusieurs où l'enfanttable peut avoir des centaines de milliers d'enregistrements. Dans ce cas, appeler Parent.ChildCollection.Count force une initialisation lente de la collection enfant qui est extrêmement coûteuse.

Dans Hibernate 3.0, il existe une fonctionnalité lazy = "extra" qui vous permet de vérifier un sous-ensemble de propriétés de collection sans charger paresseux le tout.

Malheureusement, cela ne sera pas disponible avant NHibernate 2.1, qui est toujours en Alpha. http://jira.nhibernate.org/browse/NH-855

Comment puis-je accomplir cela avec NHibernate 2.0.1?

J'avais l'habitude d'avoir des propriétés spéciales telles que celle-ci

<property name="ChildCollectionCount" type="int" formula="(select count(*) from ChildTable child where child.parentID = parentID "/>

mais je ne peux plus les utiliser car je partage maintenant cette bibliothèque et c’est un problème de performances pour les autres utilisateurs.

Réponses:

0 pour la réponse № 1

Quand vous dites que c’est un problème de performance pour d’autresUtilisateurs, voulez-vous dire qu'ils veulent aussi accéder à la collection, mais que c'est trop volumineux pour eux? Ou l'extrait de code / ChildCollectionCount est-il trop lent pour eux?

Si c'est le premier cas, vous devrez peut-être leur proposer une solution similaire: identifiez exactement ce dont ils ont besoin et fournissez des méthodes offrant cette possibilité.


0 pour la réponse № 2

très tard, mais vous pouvez appliquer un filtre sur la collection

IQuery q = nhSession.CreateFilter(Parent.ChildCollection, "select count(*)");
long countResult = q.UniqueResult<long>();

cela ne forcera pas l'initialisation de la collection mais effectuera une seule requête sur la base de données


0 pour la réponse № 3

Je recommanderais une requête séparée plutôt qu'une relation de domaine. Ensuite, vous pouvez utiliser toutes sortes d'optimisations.