In ASP.NET 3.5 è stata introdotta la nuova LinqDataSource che consente di fare delle query direttamente su una sorgente dati LinqToSQL. Durante una prova mi sono reso conto che la conversione del tipo del dato fornito dalla proprietà SelectedValue di una ListView falliva con il seguente errore:

Operator '==' incompatible with operand types 'Int32' and 'Object'

Il problema è dato dal fatto che la proprietà SelectedValue è di tipo object mentre MeetingId è di tipo Int32, così come specificato dal ControlParameter. In tale caso il runtime non è in grado di operare la conversione e di conseguenza solleva questa eccezione.

Per ovviare al problema occorre usare un operatore di conversione Int32() nella clausola Where della LinqDataSource come segue:

<asp:LinqDataSource ID="lds" runat="server" ContextTypeName="MeetingSummary.XeDotNetDataContext" TableName="Subscriptions" Where="MeetingId == Int32?(@MeetingId)"> <WhereParameters> <asp:ControlParameter ControlID="meetingsListView" Name="MeetingId" PropertyName="SelectedValue" Type="Int32" /> </WhereParameters> </asp:LinqDataSource>

Dato che MeetingId è una proprietà Nullable è anche necessario specificare l'operatore ? che indica appunto l'uso di parametri nullabili. Ecco quindi che il nostro operatore diventa Int32?().

Per le conversioni sono disponibili gli operatori per tutti i tipi che lo richiedono: Object, Boolean, Char, String, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Decimal, Single, Double, DateTime, TimeSpan e Guid


Aggiungi Commento