Posts
163
Comments
179
Trackbacks
5
dicembre 2009 Blog Posts
NHibernate.Linq e l’errore "Expression of type 'System.Int32' cannot be used for return type 'System.Boolean"


Primi esperimenti con il provider LINQ per NHibernate e primi problemi.
Scenario: vorrei eseguire una semplicissima query confrontando un campo stringa con un valore immesso dall’utente. Qui di seguito la query:

   1: Dim items = From u In q _
   2:             Where u.Username = userName

La query è ovviamente banale, ma produce questo errore:

"Expression of type 'System.Int32' cannot be used for return type 'System.Boolean"

Dopo aver verificato la correttezza della mia applicazione, sono passato al solito Google. Ed ecco spiegato il problema in dettaglio in questo post: http://jason.pettys.name/archive/2009/09/28/nhibernate-with-linq-error-with-string-comparisons-in-vb.net.aspx.

Sostanzialmente quando si utilizza VB.NET, il compilatore VB emette la funzione CompareString. Qui in dettaglio un post del team di VB.NET con relativo fix: http://blogs.msdn.com/vbteam/archive/2007/09/18/vb-expression-trees-string-comparisons.aspx

Ovviamente il problema si ha solo con VB.NET e si può semplicemente risolvere passando a C# :).
Se proprio ci si ostina ad usare VB.NET (come nel mio caso) si può anche utilizzare il fix indicato nel primo post e modificare il codice sorgente di NHibernate.LINQ. Questo ovviamente in attesa che il bug venga corretto in modo ufficiale.

Attenzione però che applicando solo il fix senza nessun altro intervento sul codice sorgente, avremo che la comparazione funzionerà solo nel caso si utilizzi un singolo campo. Se si comparano più campi (ad esempio nel caso precedente Username e Password) salta fuori un altro errore che occorre gestire in qualche modo.

Al momento non ho avuto tempo di fare altri esperimenti. In ogni caso il bug è già stato segnalato in via ufficiale.

posted @ giovedì 31 dicembre 2009 14:32 | Feedback (0)
Eager load con NHibernate.Linq


Modificare la strategia di caricamento delle entità a runtime è senz’altro uno dei punti di forza di NHibernate.
Utilizzando Criteria si può utilizzare il metodo SetFetchMode per modificare la modalità di fetch, mentre chi usa HQL può usare il fetch join per eseguire un eager load di una entità. Ma volendo usare NHibernate.Linq come possiamo fare?

Fortunatamente esiste un apposito extension method, l’Expand. Nell’esempio qui sotto carichiamo una fattura con il relativo cliente utilizzando un’unica query:

   1: Dim q = Me.GetSession.Linq(Of Fattura)()
   2: q.Expand("Cliente")
   3:  
   4: Dim items = From item In q _
   5:             Where item.Numero = "10"
   6: ' Restituisco la lista
   7: Return items.ToList()(0)
posted @ mercoledì 30 dicembre 2009 17:31 | Feedback (0)
Problema con jQuery datepicker e IE


Utilizzo ormai jQuery e relativi controlli da molto tempo. Ieri utilizzando l’ultima versione del datepicker ho ottenuto uno strano comportamento: su Internet Explorer e solo su quello, selezionando la data corrente mi veniva restituito l’errore javascript “length is null or not an object”.

Cercando su internet sono arrivato su questo post che analizza il problema e fornisce la soluzione: come spiegato, è sufficiente utilizzare l’evento onSelect che viene scatenato ogni volta che si seleziona un giorno dal calendario. All’evento, se non ci sono altre necessità particolari, va associata una funzione vuota:

 

$(".datepicker").datepicker({ onSelect:function(){}});

posted @ giovedì 3 dicembre 2009 12:03 | Feedback (1)
Visual NHibernate

Non lo conoscevo proprio! A questo indirizzo è possibile trovare Visual NHibernate un simpatico tool per creare e gestire progetti NHibernate.

E’ ancora in beta e mancano molte cose, ma mi sembra molto promettente. Sul gruppo di discussione nhusers c’e’ una discussione attiva che indica pregi e mancanze del progetto.

posted @ giovedì 3 dicembre 2009 12:02 | Feedback (2)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS