<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>NHibernate</title>
        <link>http://blogs.ugidotnet.org/belius/category/NHibernate.aspx</link>
        <description>NHibernate</description>
        <language>it-IT</language>
        <copyright>Simone Belia</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>NHibernate 1.2.1GA</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/11/27/nhibernate-1.2.1ga.aspx</link>
            <description>&lt;p&gt;Ieri è stata rilasciata la versione 1.2.1GA e la potete trovare a questo indirizzo:&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a target="_blank" href="http://sourceforge.net/project/showfiles.php?group_id=73818&amp;amp;package_id=73969"&gt;http://sourceforge.net/project/showfiles.php?group_id=73818&amp;amp;package_id=73969&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Di aggiunte non ha, hanno solo corretto alcuni bug, ma la bella notizia è che stavano aspettando di rilasciare questa release per iniziare a dedicarsi pesantemente alla versione 2.0.....e li si che ci sarà da divertirsi.&lt;/p&gt;
&lt;p&gt;A questo &lt;a target="_blank" href="http://www.ayende.com/Blog/archive/2007/11/13/What-is-going-on-with-NHibernate-2.0.aspx"&gt;indirizzo&lt;/a&gt; potete trovare quelle che saranno le nuove funzionalità...e non sono poche.&lt;br /&gt;
Leggete anche i feedback ce n'è uno di Fabio Maulo che integra il post.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/89977.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/11/27/nhibernate-1.2.1ga.aspx</guid>
            <pubDate>Tue, 27 Nov 2007 19:16:04 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/11/27/nhibernate-1.2.1ga.aspx#feedback</comments>
            <slash:comments>67</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/89977.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/89977.aspx</trackback:ping>
        </item>
        <item>
            <title>Recuperare solo i valori essenziali con Nhibernate</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/11/16/recuperare-solo-i-valori-essenziali-con-nhibernate-again.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;L'infrastruttura di NHibernate ci permette di recuperare con pochi sforzi le informazioni che stanno nel DB sottoforma di nostre classi opportunamente istruite.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Bene....e che c'è di nuovo? &lt;br /&gt;
Nulla....ma ipotizziamo questo:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Ho una classe Customer che contiene 40 proprietà (non associazioni) che la descrivono.&lt;br /&gt;
Ora voglio che in un menu a tendina della mia applicazione vengano inseriti tutti i Customer così da farne scegliere uno all'utente.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;In questo scenario quello che mi serve è solo l'ID del customer ed il suo nome....allora perchè caricarsi tutti quanti i suoi dati?&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;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!!! :-)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Per prima cosa mi sono costruito una classe generica che mi permetta di descrivere i miei valori:&lt;/font&gt; &lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NameValueDTO&amp;lt;Tv, Tn&amp;gt;
{
&lt;span class="kwrd"&gt;   private&lt;/span&gt; Tn _name;
&lt;span class="kwrd"&gt;   private&lt;/span&gt; Tv _value; 

&lt;span class="kwrd"&gt;   public&lt;/span&gt; Tn Name 
   { 
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _name; } 
   } 
        
   &lt;span class="kwrd"&gt;public&lt;/span&gt; Tv Value 
   { 
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _value; } 
   }

   &lt;span class="kwrd"&gt;public&lt;/span&gt; NameValueDTO(Tv &lt;span class="kwrd"&gt;value&lt;/span&gt;, Tn name)
   {
      _name = name;
      _value = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
   }
}&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;NameValueDTO&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; GetNameValue&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt; propName)
{
   ICriteria criteria = _session.CreateCriteria(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));
   ProjectionList pl = Projections.ProjectionList();
                        
   pl.Add(Projections.Id());
   pl.Add(Projections.Property(propName));&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;   criteria.SetProjection(pl);
                        
   criteria.SetResultTransformer(&lt;span class="kwrd"&gt;new&lt;/span&gt; NHibernate.Transform.AliasToBeanConstructorResultTransformer(
               &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(NameValueDTO&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;).GetConstructors()[0]));

&lt;span class="kwrd"&gt;   return&lt;/span&gt; criteria.List&amp;lt;NameValueDTO&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;();
}&lt;/pre&gt;
&lt;pre class="csharpcode"&gt; &lt;/pre&gt;
&lt;p&gt;Esaminiamo il codice.&lt;br /&gt;
La prima istruzione crea un oggeto &lt;strong&gt;Criteria&lt;/strong&gt; basandosi sul tipo della classe che ho passatto come parametro del generic.&lt;br /&gt;
Successviamente creo una &lt;strong&gt;ProjectionList&lt;/strong&gt; che mi servirà per incapsulare i campi che desidero "aggregare" (anche se non è la parola giusta in questo esempio....:-)).&lt;/p&gt;
&lt;p&gt;L'istruzione successiva è la più interessante.&lt;br /&gt;
&lt;strong&gt;SetResultTransformer&lt;/strong&gt; dice ad NH di trasformare (&lt;em&gt;AliasToBeanConstructorResultTransformer&lt;/em&gt;) i valori di ritorno dalla query istanziare nel tipo di oggetto che gli ho specificato (&lt;em&gt;&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(NameValueDTO&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;,&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;)&lt;/em&gt;) utilizzando il primo costruttore &lt;em&gt;GetConstructors()[0];&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A questo punto il gioco è fatto....richiamando il metodo GetNameValue mi verrà ritornata la mia bella collezione con solo i campi richiesti.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/89738.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/11/16/recuperare-solo-i-valori-essenziali-con-nhibernate-again.aspx</guid>
            <pubDate>Fri, 16 Nov 2007 19:57:26 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/11/16/recuperare-solo-i-valori-essenziali-con-nhibernate-again.aspx#feedback</comments>
            <slash:comments>15</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/89738.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/89738.aspx</trackback:ping>
        </item>
        <item>
            <title>NHibernate complex queries</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/10/10/nhibernate-complex-queries.aspx</link>
            <description>&lt;p&gt;Poco tempo fa (e tutt'ora) mi sono trovato di fronte ad un'applicazione sviluppata con NHibernate che richiedeva moltissimi filtri per fare delle ricerche molto complesse.&lt;/p&gt;
&lt;p&gt;Cercando un pò in giro sono arrivato a leggere questo articolo di Ayende che esponeva una soluzione molto elegante e funzionale per effettuare ricerche complesse con NHibernate.....ed a pensarci bene è un buon pattern anche senza l'uso di NH.&lt;/p&gt;
&lt;p&gt;L'articolo lo trovate qui: &lt;font face="Arial"&gt;&lt;a href="http://www.ayende.com/Blog/archive/2006/12/07/7055.aspx"&gt;http://www.ayende.com/Blog/archive/2006/12/07/7055.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Il concetto di base è quello di crearsi un oggetto Finder che non fa altro che incapsulare tutti i dati che devono essere cercati. Questo oggetto viene poi passato ad un metodo che altro non fa che valutare le informazioni presenti nell'oggetto per poi costruire il criteria o l'hql necessario.&lt;/p&gt;
&lt;p&gt;Tornando al mio applicativo, ho notato che c'erano dei casi in cui la semplice impostazione di una Property non mi bastava poichè dovevo legarci anche come quell'informazione doveva essere trattata. &lt;/p&gt;
&lt;p&gt;Per esempio una Property cognome doveva essere corredata anche dall'informazione di dove cercare, ossia se il valore doveva essere *contenuto*, oppure *iniziare per* o *finire per*. Altro esempio erano i valori range, come controllare se alcune informazioni erano comprese tra la data e la data.&lt;/p&gt;
&lt;p&gt;Proprio per questo ho esteso la soluzione di Ayende creandomi un paio di classi chiamate SearchableField e SearchableRange.&lt;br /&gt;
&lt;br /&gt;
L'implementazione delle classi è:&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;//SEARCHABLEFIELD&lt;/font&gt;&lt;br /&gt;
&lt;font color="#0000ff"&gt;public class &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;T&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;T _search&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        private &lt;/font&gt;&lt;font color="#000000"&gt;FinderOperator _expression &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;FinderOperator.Equals&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
        public &lt;/font&gt;&lt;font color="#000000"&gt;FinderOperator Expression&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_expression&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _expression &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;T Search&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_search&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _search &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField(T search, FinderOperator expression)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;._search &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;search&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
            this&lt;/font&gt;&lt;font color="#000000"&gt;._expression &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;expression&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
    }&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;//SEARCHABLERANGE&lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;public class &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;T&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;T&amp;gt; _from&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;T&amp;gt; _to&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
        public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;T&amp;gt; From&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_from&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _from &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;T&amp;gt; To&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_to&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _to &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange(SearchableField&amp;lt;T&amp;gt; from, SearchableField&amp;lt;T&amp;gt; to)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;._from &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;from&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
            this&lt;/font&gt;&lt;font color="#000000"&gt;._to &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;to&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    }&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Logicamente le due classi utilizzano i Generics così da poter essere riutilizzate a seconda del tipo da implementare.&lt;br /&gt;
&lt;br /&gt;
Come noterete c'è anche un parametro di tipo FinderOperator che identifica quale comportamento di ricerca implementare.&lt;br /&gt;
&lt;br /&gt;
&lt;font face="Arial"&gt;&lt;font color="#0000ff"&gt;public enum &lt;/font&gt;&lt;font color="#000000"&gt;FinderOperator&lt;br /&gt;
    { &lt;br /&gt;
        Equals &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        NotEquals &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        Contains &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        GreaterThan &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;3&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        LessThan &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;4&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        GreaterOrEqualThan &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;5&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        LessOrEqualThan &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;6&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        In &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;7&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;
        NotIn &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;8&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;A questo punto l'unica cosa che era rimasta da fare è crearmi la mia classe Finder di cui qua riporto un abstract:&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;public class &lt;/font&gt;&lt;font color="#000000"&gt;CustomerFinder&lt;br /&gt;
    {&lt;br /&gt;
    &lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;#region&lt;/font&gt;&lt;font color="#000000"&gt; Social Field&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; _companyName &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;br /&gt;
        private int&lt;/font&gt;&lt;font color="#000000"&gt;? _customerId &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br /&gt;
        private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; _age &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;        public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; Age&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_age&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _age &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; CompanyName&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_companyName&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _companyName &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public int&lt;/font&gt;&lt;font color="#000000"&gt;? CustomerId&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_customerId&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _customerId &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;#endregion&lt;br /&gt;
&lt;br /&gt;
        #region&lt;/font&gt;&lt;font color="#000000"&gt; Geographic Fields&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;List&amp;lt;Country&amp;gt;&amp;gt; _localities &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;br /&gt;
&lt;br /&gt;
        public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;List&amp;lt;Country&amp;gt;&amp;gt; Localities&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_localities&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _localities &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;#endregion&lt;br /&gt;
&lt;br /&gt;
        #region&lt;/font&gt;&lt;font color="#000000"&gt; Economic Fields&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;DateTime?&amp;gt; _purchasedDates&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        private &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;decimal&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; _amount&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br /&gt;
        public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;DateTime?&amp;gt; PurchasedDates&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_purchasedDates&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _purchasedDates &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SearchableRange&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;decimal&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; Amount&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_amount&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _amount &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;        &lt;/font&gt;&lt;font color="#0000ff"&gt;#endregion &lt;br /&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;br /&gt;
    &lt;/font&gt;} &lt;/p&gt;
&lt;p&gt;ed il suo utilizzo è stato una cosa del genere:&lt;/p&gt;
&lt;p&gt;CustomerFinder cf &lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;CustomerFinder()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;cf.CompanyName &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;SearchableField&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;(&lt;/font&gt;&lt;font color="#808080"&gt;"Gates"&lt;/font&gt;&lt;font color="#000000"&gt;,FinderOperator.Contains)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;font color="#000000"&gt;cf.Age = new &lt;font color="#000000"&gt;SearchableField&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;(&lt;/font&gt;&lt;font color="#808080"&gt;25&lt;/font&gt;&lt;font color="#000000"&gt;,FinderOperator.GreaterOrEqualThan)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;CustomerPersistence persistence &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;CustomerPersistence()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;IList&amp;lt;Customer&amp;gt; list &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;persistence.Find(cf)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Logicamente ci sarebbe ancora tanto da fare.....ma se qualcuno ha tempo potrebbe estendere ancora di più, no?&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88882.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/10/10/nhibernate-complex-queries.aspx</guid>
            <pubDate>Wed, 10 Oct 2007 19:04:13 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/10/10/nhibernate-complex-queries.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88882.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88882.aspx</trackback:ping>
        </item>
    </channel>
</rss>