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.