2010-01-16 8 views
2

Mes cours ressemblent à ceci (je ne comprennent que les propriétés pertinentes):NHibernate: obtenir plusieurs entités avec un sous-ensemble de collection enfant?

public class Order 
{ 
    public virtual Customer Customer { get; set; } 
    public virtual IEnumerable<OrderLine> OrderLines { get; set; } 
} 

public class OrderLine 
{ 
    public virtual string Product { get; set; } // Simplified 
} 

Maintenant, je Ce que je veux est de créer un critère détaché qui sélectionne toutes les commandes pour un client donné, et en même récupère temps seulement les 10 premières lignes de commande pour chaque commande. La première partie est facile:

Customer someCustomerObject = ...; 
var criteria = DetachedCriteria.For<Order>().Add(Restrictions.Eq("Customer", someCustomerObject); 

Mais comment puis-je récupérer instruis NHibernate avec impatience les 10 premières lignes de commande pour chaque commande récupéré par les critères ci-dessus?

J'ai essayé d'utiliser un filtre basé sur l'exemple suivant (extrait de la documentation NHibernate):

session.CreateFilter(lazyCollection, "").SetFirstResult(0).SetMaxResults(10).List(); 

Mais quand je donne Order.OrderLines la méthode CreateFilter, il récupère toutes les lignes de commande d'abord, puis ensuite récupère les 10 premières lignes de commande, ce qui n'est pas ce que je veux. J'ai également essayé de combiner cela avec un appel à NHibernateUtil.Initialize en vain. Comment puis-je créer un critère détaché pour ce problème? Ou, si ce n'est pas tout à fait possible, comment puis-je récupérer, pour chaque commande, les 10 premiers résultats, sans aller chercher la totalité de la collection?

+0

Ce qui se passe si vous faites l'appel à setMaxResults sur les « critères » au lieu? –

Répondre

0

Vous pouvez définir la propriété batch-size sur 10 dans le fichier de mappage NHibernate pour la classe Order. De cette façon, il charge avec empressement les 10 premiers éléments de la collection et paresseux charge le reste des éléments. Je carte la collection comme suit:

<set name="OrderLines" table="OrderToOrderLine" batch-size="10"> 
    <key column="OrderId"/> 
    <one-to-many class="OrderLine"/> 
</set> 

Plus d'informations, consultez le: NHibernate Mapping - Collections