2009-07-24 5 views
2

J'utilise ASP.NET-MVC et nHibernate pour la première fois. De bons outils, mais une grande courbe d'apprentissage!Comment utiliser nHibernate pour obtenir un petit sous-ensemble de propriétés d'objet pour la vue de liste

J'ai une vue de liste des objets qui sont assez grands (chacun a environ 60 propriétés). Dans la liste, je n'utilise que 10 de ces propriétés. Les performances ne sont pas trop mauvaises, mais cela semble un gâchis d'hydrater complètement ces objets. Quelle est la pratique recommandée?

J'ai essayé d'utiliser HQL pour sélectionner moins de propriétés, mais il semble qu'il n'hydrate pas partiellement un objet. J'ai également essayé de faire une propriété sur l'objet principal qui était une classe d'en-tête avec les propriétés de la vue liste, mais je n'arrivais pas à la faire correctement mapper. Je pense que cela devrait être facile, mais j'ai vraiment eu du mal avec ça. Je n'arrêtais pas de revenir là-dessus parce que je savais qu'Anton m'avait donné la réponse et que je ne pouvais tout simplement pas la voir.

Il y a trois choses que vous devez faire:

  1. faire un objet avec les propriétés souhaitées.
  2. Créez un fichier de mappage pour importer cet objet.

    < hibernate-mapping xmlns = "urn: NHibernate-mapping-2.2" namespace = "Core.Entities" assemblage = "Core" par défaut d'accès = "propriété">
    < classe import = » RequestHeader »/ >
    </hibernate-mapping>

  3. Si vous utilisez HQL, votre objet doit contenir un constructeur avec toutes les propriétés, dans le même ordre, que votre sélection nouvelle déclaration. Si vous utilisez l'API Criteria, vous n'avez pas besoin de le faire.

    public IList<RequestHeader> ListAll() 
    { 
        using (ISession session = GetSession()) 
        { 
         using (ITransaction tx = session.BeginTransaction()) 
         { 
          IList<RequestHeader> results = session.CreateCriteria(typeof (Request), "r") 
           .CreateCriteria("Requestor", "req", JoinType.InnerJoin) 
           .CreateCriteria("r.Grant", "g", JoinType.InnerJoin) 
           .SetProjection(Projections.ProjectionList() 
            .Add(Projections.Property("r.Id"), "Id") 
            .Add(Projections.Property("r.Status"), "Status") 
            .Add(Projections.Property("r.SubmissionDate"), "SubmissionDate") 
            .Add(Projections.Property("req.Name"), "Requestor") 
            .Add(Projections.Property("g.Number"), "Number")) 
           .SetResultTransformer(Transformers.AliasToBean(typeof (RequestHeader))) 
           .SetMaxResults(10000) 
           .List<RequestHeader>(); 
          tx.Commit(); 
          return results; 
         } 
        } 
    } 
    

Répondre

1

60 propriétés est trop. Voir Component mapping.

En ce qui concerne la sélection d'un sous-ensemble de propriétés, voir this: vous avez besoin d'une construction HQL select new. Sachez cependant que vous avez besoin d'un constructeur approprié et qu'un objet que vous obtiendrez ne peut pas être sauvegardé dans la base de données.

+0

Merci. J'avais lu vos deux liens, mais à un moment où plus je lisais, plus j'étais confus. Je commence enfin à entamer le concept ORM. Je recommande les vidéos "Summer of nHibernate" de Steve Bohlen à tous ceux qui veulent commencer. – Leslie

Questions connexes