Question: Comment obtenir un critère de chargement chargé pour renvoyer des résultats paginés sur l'entité racine avec toutes les collections enfant définies fetchmode = eager.NHibernate paging critères avec fetchmode désireux. (utilisation de NH fluide)
J'essaie d'obtenir un ensemble de résultats paginés de 10 éléments avec des collections enfants chargées. Le problème est que la requête fait un top 10 sélectionné autour de la sélection complète. Le fait de renvoyer seulement les 10 premiers résultats, y compris tous les enregistrements joints. Si la première entité a 10 objets enfants, alors mon jeu de résultats renverra 1 entité avec 10 objets enfants chargés. J'ai besoin des entités et des collections d'enfants retournés hydratés (paresseux). Si je désactive le chargement paresseux et exécute cette requête, j'obtiens la requête n + 1 pour chaque associé dans le jeu de résultats.
Ceci est mon processus de requête de base:
criteria = context.Session.CreateCriteria<Associate>();
criteria.SetMaxResults(10); //hardcoded for testing
criteria.SetFirstResult(1); //hardcoded for testing
criteria.SetFetchMode("Roles", NHibernate.FetchMode.Eager);
criteria.SetFetchMode("Messages", NHibernate.FetchMode.Eager);
criteria.SetFetchMode("DirectReports", NHibernate.FetchMode.Eager);
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
return criteria.List<Associate>();
public AssociateMap()
{
ReadOnly();
Id(x => x.AssociateId);
Map(x => x.FirstName);
Map(x => x.LastName);
Map(x => x.ManagerId);
Map(x => x.Department);
Map(x => x.Email);
Map(x => x.JobTitle);
Map(x => x.LastFirstName).Formula("LTRIM(RTRIM(LastName)) + ', ' + LTRIM(RTRIM(FirstName))");
HasMany(x => x.Messages).KeyColumn("AssociateId").Inverse().Cascade.All();
HasMany(x => x.Roles).Element("RoleKey");
HasMany(x => x.DirectReports).KeyColumn("ManagerId").Cascade.None().ForeignKeyConstraintName("FK_Associate_Manager");
//HasMany(x => x.DirectReports).Element("ManagerId").CollectionType(typeof(Domain.Associate));
}
J'aime cette solution. –
+1 pour avoir partagé la réponse. – kerzek