Vous pouvez créer une classe DTO que vous utilisez pour des rapports/vues d'ensemble par exemple ... Cette classe pourrait ressembler à ceci:
public class PersonView
{
public string Name{ get;set; }
public int NumberOfSubordinates{get;set;}
}
Ensuite, vous créez une requête de critères, dans ce critères que vous définissez que vous voulez récupérer toutes les personnes. Toutefois, vous pouvez spécifier que NHibernate ne doit pas renvoyer d'objets Person, mais des objets PersonView. Pour pouvoir faire cela, vous aurez besoin d'utiliser une projection et un AliasToBeanTransformer:
ICriteria crit = new Criteria(typeof(Person));
crit.SetProjection (Projections.ProjectionList()
.Add (Projections.Property("Name"), "Name")
.Add (Projections.Count ("Subordinates"), "NumberOfSubordinates");
crit.SetResultTransformer(Transformers.AliasToBean (typeof(PersonView));
Quelque chose comme ci-dessus. (Je n'ai pas testé votre situation spécifique). Ensuite, vous devez juste informer NHibernate de l'existence de la classe PersonView, simplement en 'important' cette classe. J'ai un fichier hbm.xml, où j'importe toutes mes classes DTO. Cela ressemble
<hibernate-mapping .. >
<import class="PersonView" />
</hibernate-mapping>
Ensuite, NHibernate va générer une requête pour vos critères qui ressemble beaucoup à peu:
SELECT p.Name, COUNT(p.Subordinates) FROM Person
INNER JOIN Subordinates ON Person.PersonId = Subordinates.PersonID
GROUP BY p.Name
Voulez-vous lier objet personne à une grille? –