Belius' Blog

Il blog di Simone Belia
posts - 16, comments - 335, trackbacks - 31

venerdì 16 novembre 2007

Recuperare solo i valori essenziali con Nhibernate

L'infrastruttura di NHibernate ci permette di recuperare con pochi sforzi le informazioni che stanno nel DB sottoforma di nostre classi opportunamente istruite.

Bene....e che c'è di nuovo?
Nulla....ma ipotizziamo questo:

Ho una classe Customer che contiene 40 proprietà (non associazioni) che la descrivono.
Ora voglio che in un menu a tendina della mia applicazione vengano inseriti tutti i Customer così da farne scegliere uno all'utente.

In questo scenario quello che mi serve è solo l'ID del customer ed il suo nome....allora perchè caricarsi tutti quanti i suoi dati?

Negli ultimi progetti che ho sviluppato con NHibernate ho cercato di trovare una metodologia per venire incontro a questa comune problematica in maniera "comoda" e "tipizzata"....e spero che quello che ho fatto possa rilevarsi utile anche per voi!!! :-)

Per prima cosa mi sono costruito una classe generica che mi permetta di descrivere i miei valori: 

public class NameValueDTO<Tv, Tn>
{
   private Tn _name;
   private Tv _value; 

   public Tn Name 
   { 
      get { return _name; } 
   } 
        
   public Tv Value 
   { 
      get { return _value; } 
   }

   public NameValueDTO(Tv value, Tn name)
   {
      _name = name;
      _value = value;
   }
}

Successivamente mi sono costruito un metodo generico rappresentante la classe per la quale voglio estrapolare i valori (nel nostro caso Customer) ed al quale passerò il nome della proprietà dell'oggetto che vorrò visualizzare.

public IList<NameValueDTO<int,string>> GetNameValue<T>(string propName)
{
   ICriteria criteria = _session.CreateCriteria(typeof(T));
   ProjectionList pl = Projections.ProjectionList();
                        
   pl.Add(Projections.Id());
   pl.Add(Projections.Property(propName));
   criteria.SetProjection(pl);
                        
   criteria.SetResultTransformer(new NHibernate.Transform.AliasToBeanConstructorResultTransformer(
               typeof(NameValueDTO<int,string>).GetConstructors()[0]));

   return criteria.List<NameValueDTO<int, string>>();
}
 

Esaminiamo il codice.
La prima istruzione crea un oggeto Criteria basandosi sul tipo della classe che ho passatto come parametro del generic.
Successviamente creo una ProjectionList che mi servirà per incapsulare i campi che desidero "aggregare" (anche se non è la parola giusta in questo esempio....:-)).

L'istruzione successiva è la più interessante.
SetResultTransformer dice ad NH di trasformare (AliasToBeanConstructorResultTransformer) i valori di ritorno dalla query istanziare nel tipo di oggetto che gli ho specificato (typeof(NameValueDTO<int,string>)) utilizzando il primo costruttore GetConstructors()[0];

A questo punto il gioco è fatto....richiamando il metodo GetNameValue mi verrà ritornata la mia bella collezione con solo i campi richiesti.

 

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (15) | Filed Under [ NHibernate ]

Powered by:
Powered By Subtext Powered By ASP.NET