2010-09-09 4 views
1

je besoin d'aide aller chercher arborescence de db en utilisant NHibernate 3.0NHibernate aller chercher arbre entier

QueryOver.Of<Enterprise>(() => entAlias) 
    .JoinAlias(() => entAlias.ChildEntities,() => childEntityAllias, JoinType.LeftOuterJoin) 
    .TransformUsing(new DistinctRootEntityResultTransformer()) 

Je reçois seulement les deux niveaux du graphique (parent et de ses enfants), mais pas les enfants des enfants, etc.

La même chose est si j'essaie d'aller chercher les parents de la feuille. Je ne reçois que le parent de la feuille, mais pas le parent du parent du parent ... de la feuille. où niveau = n.

Ho pour faire ce type de requête. pas plus, si Icriteria, linq, HQL ou autre.

+0

Pourriez-vous montrer vos classes et vos fichiers de mapping? Votre hiérarchie arborescente est-elle de différents types à chaque niveau ou les objets Enterprise de ChildEntities sont-ils également? –

Répondre

1

Vous pouvez utiliser la taille de lot pour aller chercher les enfants plus efficacement. Les enfants sont toujours chargés par des requêtes séparées (vous ne devriez plus les joindre dans la requête), mais toujours 20 à la fois. Pour tourner "N + 1" à "N/20 + 1" qui fonctionne généralement très bien. L'avantage de cette solution est que vous n'avez pas besoin de vous soucier de vos requêtes.

Vous pouvez aussi charger les parents en lots:

<class name="Enterprise" batch-size="20"> 

Il charge un grand nombre-to-one relations avec les entreprises dans les lots si possible.

Si vous avez besoin d'encore plus d'optimisation, pensez à ajouter une référence à la racine (le parent le plus haut). Ensuite, vous pouvez charger tous les enfants d'une racine dans une requête simple. L'inconvénient est que vous devez vous soucier de cette référence, c'est une redondance qui pourrait aussi être difficile à maintenir.

+0

Merci, je pense que c'est la meilleure réponse pour l'instant. Le seul problème est que je travaille sur une base de données héritée et qu'elle utilise l'Identité comme clé primaire, de sorte que le traitement par lot est désactivé et ne peut pas être utilisé. – Luka

+0

il s'agit de la récupération par lots (pas de traitement par lots d'insert et de mise à jour). Cela devrait toujours être possible, cela ne dépend pas du type de générateur d'identifiant utilisé. –

0

Si vous voulez vraiment tout récupérer (bien que je ne sache pas pourquoi vous feriez une telle chose) alors désactiver le chargement paresseux (permettant ainsi le chargement hâtif) dans NHibernate.

Questions connexes