2010-03-17 3 views
1

J'ai et l'entité permet de l'appeler Entity, et une Child collection Children. J'ai un écran où l'utilisateur a l'information Entity, et une liste avec la collection Children, mais cette collection peut être très grande, donc je pensais à l'utilisation de la pagination: obtenir les 20 premiers éléments, et charger paresseux le prochain seulement si l'utilisateur appuie explicitement sur le bouton suivant.setfirstreult & setmaxresult dans la collection de l'enfant

donc j'ai créé dans le référentiel de l'entité une fonction avec cette signature:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage) 

je dois utiliser le setFirstResult et setMaxResult, pas dans l'entité racine Agregate, mais dans la collection des enfants. Mais quand j'utilise ces deux configurations, elles se réfèrent toujours au type d'entité de la requête HQL/Criteria.

Une autre alternative serait de créer une requête HQL/Critères pour le type Child, de définir le maximum et le premier résultat, puis de filtrer ceux qui sont dans la collection Entity Children (en utilisant la sous-requête). Mais je n'étais pas capable de faire ce filtre. S'il s'agissait d'une association bidirectionnelle (Enfant faisant référence à l'entité parente), ce serait plus facile.

Des suggestions?

Tout

+0

pour que l'enfant n'a pas FK au parent? il n'y a qu'une table de liens? – dotjoe

+0

oui, il n'y a qu'une table de liens –

Répondre

0

Une approche serait de créer une requête qui renvoie des résultats des deux tables en faisant un groupe par. Cette approche vous permet d'appliquer la pagination sur les données qui proviendront de la collection enfants et d'avoir un facteur commun (l'ID de l'entité dans chaque ligne) pendant que vous conservez votre point de départ (l'objet Entité). Ce que je veux dire quelque chose comme ça:

public IList<object> GetData(int entityID, int actualPage, int numberOfRecordsPerPage) 
     { 
      ICriteria criteria = _repository.Session.CreateCriteria<FlowWhatIfProfile>("entity") 
       .CreateCriteria("Children", "children", NHibernate.SqlCommand.JoinType.InnerJoin) 
       .Add(Restrictions.Eq("children.EntityID", entityID));   

      ProjectionList pl = Projections.ProjectionList(); 
      pl.Add(Projections.GroupProperty("children.Id")); 
      pl.Add(Projections.GroupProperty("children.Property1")); 
      pl.Add(Projections.GroupProperty("children.Property2")); 
      pl.Add(Projections.GroupProperty("children.Property2")); 
      pl.Add(Projections.GroupProperty("entity.Id")); 

      return criteria.SetProjection(pl) 
       .SetFirstResult(actualPage * numberOfRecordsPerPage) 
       .SetFetchSize(numberOfRecordsPerPage) 
       .List<object>(); 
     } 

L'inconvénient serait que vos données renvoyées sont une liste de tableaux (vous devrez jeter object-object[]) mais vous pouvez surmonter ce en utilisant la fonctionnalité AliasToBean que de peur NHibernate projette ces tableaux sur des objets fortement typés que vous définissez.

Questions connexes