2011-06-29 9 views
2

Je me demandais simplement si lors du chargement d'une entité qui contient une collection, par ex. un message qui peut contenir 0 -> n Commentaires si vous pouvez définir le nombre de commentaires à renvoyer.Fluid nHibernate Chargement sélectif pour les collections

Au moment où j'ai ceci:

public IList<Post> GetNPostsWithNCommentsAndCreator(int numOfPosts, int numOfComments) 
    { 
     var posts = Session.Query<Post>().OrderByDescending(x => x.CreationDateTime) 
      .Take(numOfPosts) 
      .Fetch(z => z.Comments) 
       .Fetch(z => z.Creator).ToList(); 

     ReleaseCurrentSession(); 
     return posts; 
    } 

Est-il possible d'ajouter un saut et prendre aux commentaires pour permettre une sorte de fonctionnalité de pagination sur la collection afin de ne pas charger beaucoup de des choses dont tu n'as pas besoin.

Je suis conscient du chargement paresseux mais je ne veux pas vraiment l'utiliser, j'utilise le modèle MVC et je veux que mon objet revienne des dépôts chargés pour que je puisse ensuite les mettre en cache. Je ne veux pas vraiment que mes vues provoquent des instructions select. Le seul vrai moyen de contourner cela est de ne pas effectuer une extraction sur les commentaires mais d'effectuer une sélection séparée sur les commentaires pour trier par heure de création, puis sélectionner le top 5 par exemple, puis placer le résultat retourné dans le message objet?

Des pensées/liens sur ce serait apprécié.

Merci,

Jon

+0

J'imagine que la jointure requise pour ce que vous recherchez est trop complexe pour NHibernate, il faudrait qu'elle sache comment utiliser un TOP sur les publications et sur les commentaires sous deux sous-sélections séparées, puis les joindre à l'externe –

Répondre

0

FETCH simple ne une jointure externe gauche sur la table associée afin qu'il puisse hydrater les entités de collecte des données. Ce que vous cherchez à faire nécessitera une requête distincte sur les entités spécifiques. De là, vous pouvez utiliser n'importe quel nombre de constructions pour limiter votre jeu de résultats (skip/take, setmaxresults, etc)