2010-06-10 45 views
0

En supposant la mise en page fictive suivanteComment aggressif une collection d'enfants tout en se joignant entités de collecte des enfants à une association

 
Dealership 
    has many Cars 
    has a Manufacturer 

Je veux écrire une requête qui dit moi un concessionnaire avec un nom de X et également obtenir la collection Cars mais utilisez une jointure contre le fabricant lorsque vous le faites. Je pense que cela nécessiterait l'utilisation d'ICriteria. Je pense à quelque chose comme ça ..

Mais la requête résultante ne ressemble à rien de ce à quoi je m'attendais. Je commence à penser qu'un DetachedCriteria peut être exigé quelque part mais je ne suis pas sûr.

Pensées?

Répondre

2

L'extraction de collections dans la même requête n'est presque jamais la meilleure solution.

Une des meilleures approches est détaillée dans ce lien: http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

Personnellement, ma solution préférée consiste à utiliser batch-size tant dans les collections et les entités, définies à la taille de ma longueur de page par défaut. De cette façon, votre requête ci-dessus serait faite avec 3 requêtes bon marché et personnalisables, au lieu d'une requête coûteuse.

+0

J'aurais dû mentionner que nous utilisons un Oracle plus ancien, donc la taille de lot ne fonctionne pas. –

+0

Aussi, je n'essaie pas d'obtenir deux collections de concession. Je veux que Cars charge son Fabricant avec empressement. Le lien que vous avez envoyé est plus associé à plusieurs collections d'une même racine. –

+0

'batch-size' sur les entités et les collections fonctionne sur toutes les bases de données. Et la solution d'Ayende fonctionne pour n'importe quel nombre de collections; l'idée est que vous obtenez la racine (s) dans une requête et les collections dans une autre. –