2012-01-23 3 views
0

J'ai besoin d'un moyen de récupérer avec impatience toutes les collections enfants de toutes les entités d'un certain type en utilisant NHibernate.Comment aller chercher toutes les collections enfants avec impatience?

J'ai essayé:

var myObjectList = SessionHolder.Current 
    .CreateCriteria(typeof(MyObject)) 
    .SetFetchMode("Clients", FetchMode.Eager) 
    .SetFetchMode("Locations", FetchMode.Eager) 
    .SetFetchMode("Contracts", FetchMode.Eager) 
    .List<MyObject>(); 

requête doit était retourné toutes les instances de myObject de la DB avec leurs collections avec impatience chargés, mais cela n'a pas fonctionné comme prévu, au lieu, il est revenu plus d'objets que prévu. Je suppose que cela a quelque chose à voir avec n + 1 sélectionne le problème.

J'ai trouvé this solution pour récupérer les collections mais je suis actuellement limité à utiliser NHibernate 1.2.1.4000 donc je ne peux pas utiliser Futures.

J'ai fait beaucoup de recherches avant de poster mais je n'ai rien trouvé.

Merci pour vos réponses!

Répondre

1

Essayez d'utiliser un transformateur distinct résultat:

var myObjectList = 
    SessionHolder.Current 
       .CreateCriteria(typeof(MyObject)) 
       .SetFetchMode("Clients", FetchMode.Eager) 
       .SetFetchMode("Locations", FetchMode.Eager) 
       .SetFetchMode("Contracts", FetchMode.Eager) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .List<MyObject>(); 
+0

Je l'ai testé, maintenant il retourne le bon nombre d'entités myObject mais les enfants sont retournés répliquées, par exemple, pour une instance de MyObject je pourrais avoir dans le retour liste des clients: Client1, Client1, Client1, Client2, Client2, Client2. Toute idée pourquoi cela arrive? –

+0

Pourriez-vous s'il vous plaît l'essayer en utilisant HQL? Quelque chose comme 'SessionHolder.Current.CreateQuery (" de MyObject o gauche joint fetch o.Clients gauche rejoindre fetch o.Locations gauche rejoindre fetch o.Contracts "). SetResultTransformer (nouveau DistinctRootEntityResultTransformer()). Liste ()' –

+0

sûr, Je vais essayer –

Questions connexes