Posts
163
Comments
179
Trackbacks
5
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 on giovedì 31 dicembre 2009 15:32 Print
Comments have been closed on this topic.
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS