none
QueryLinq Handling Null Value RRS feed

  • Domanda

  • Ciao gente!

    Ho una query bella pimpante che estrae dati da un context creato mediante Linq2Entities. Funziona tutto alla grande, ma ho un problema.
    Alcune celle all'interno di una tabella sono nulle (non vuote ma null)

    Questa è la query con la quale riempio la classe LT_Lotti

    Public Function GetAllLotti() As IEnumerable(Of LT_Lotti)
    
            Dim q = _
    
                    From x In _db.com_lotti _
    
                    Select New LT_Lotti With _
    
                    { _
    
                     .Commessa = x.commessa, _
    
                     .Lotto = x.lotto, _
    
                     .Anticipo = x.anticipo, _
    
                     .Trasmissione = x.trasmissione, _
    
                     .DataConsegna = x.dataconsegna, _
    
                     .Tipoimballo = x.tipoimballo _
    
                     }
    
            Return q
    
        End Function

    Una volta estratti i dati, li riutilizzo con:

        Public Function GetLottiByCommessa(ByVal C As String, ByVal L As Integer) As List(Of LT_Lotti)
    
            Return (From x In Me.GetAllLotti() _
    
                   Where x.Commessa = C _
    
                   And x.Lotto = L _
    
                   Select x).ToList()
    
        End Function
    E questo è l'errore:

    The cast to value type 'Int32' failed because the materialized value is null. 
    Either the result type's generic parameter or the query must use a nullable type.

    Questa infinte è la struttura della tabella, praticamente tutti i campi eccetto i primi possono ammettere null values.

    (checked significa che accetta NULL)

    commessa nvarchar(20) Checked
    lotto int Checked
    anticipo nvarchar(50) Checked
    trasmissione datetime Checked
    dataconsegna datetime Checked
    tipoimballo nvarchar(70) Checked


    Quello che vorrei è che: Se la data è null mi ritorni una data nulla tipo 01/01/1900. Se un intero è null mi torni 0. Se una stringa è null mi torni "" (vuota)

    Spero di essermi spiegato e vi ringrazio per l'eventuale attenzione :-)
    Ciao!!!
    martedì 9 febbraio 2010 16:45

Risposte

  • Mi confermi che nella Entity LT_Lotti nel modello per le property Anticipo, Trasmissione e DataConsegna sono marcate Nullable ?
    • Contrassegnato come risposta VMarch mercoledì 10 febbraio 2010 11:37
    mercoledì 10 febbraio 2010 09:33

Tutte le risposte

  • Non dici dove ti da errore. Comunque tieni presente che:

    > Public Function GetAllLotti() As IEnumerable(Of LT_Lotti)
    > [..]
    > Una volta estratti i dati, li riutilizzo con:

    A questo punto ancora la query NON è stata eseguita..


    Presumo che nel modello del database i campi della tabella sono stati mappati come Nullable.
    Detto questo per fare quello che vuoi tu devi fare:

    if (dataconsegna.HasValue) Then
       dataconsegna...
    else
       DateTime.MinValue
    end if


    if (mioIntero.HasValue) Then
       mioIntero...
    else
       0..
    end if
    martedì 9 febbraio 2010 18:32
  • Ciao Massimo, ho capito il senso del tuo discorso, ma non ho proprio capito dove inserire il codice che mi hai descritto...
    Potresti darmi delle info in più?
    mercoledì 10 febbraio 2010 07:21
  • Rettifico: l'if và messo nella query ma non capisco come... ho provato cosi:

            Dim q = _
                    From x In _db.com_lotti _
                    Select New LT_Lotti With _
                    { _
                     .Commessa = x.commessa, _
                     .Lotto = x.lotto, _
                     .Anticipo = IIf(x.anticipo = Nothing, x.anticipo, ""), _
                     .Trasmissione = IIf(x.trasmissione = Nothing, x.trasmissione, DateTime.MinValue), _
                     .DataConsegna = IIf(x.dataconsegna = Nothing, x.dataconsegna, DateTime.MinValue), _
    
    [..continua...]
    
    Ma non funziona.... dice che iif non è supportato da Linq2Entities....
    Su internet non ho trovato grandi info...
    Sul mio libro sto cercando adesso, ma non mi pare di esser fortunato...
    mercoledì 10 febbraio 2010 08:22
  • Procedo con il mio diario di bordo :-)

    Ulteriori informazioni. Credo che il problema sia peggiore di quanto immaginassi.
    Sono entrato nel DB e ho scelto una riga in particolare (quella con ID 2 per la cronaca).

    Ho riempito TUTTI i campi possibili, quindi, in quel record, non ci sono celle Null.
    Dovrebbe funzionarare no?

    Ed invece niente... continua a dare quell'errore...
    Ho notato che il problema lo da, SOLO con i campi di tipo DateTime e di tipo Intero...
    Molto molto strano... avete qualche idea?
    mercoledì 10 febbraio 2010 09:00
  • Mi confermi che nella Entity LT_Lotti nel modello per le property Anticipo, Trasmissione e DataConsegna sono marcate Nullable ?
    • Contrassegnato come risposta VMarch mercoledì 10 febbraio 2010 11:37
    mercoledì 10 febbraio 2010 09:33
  • Nella entity intendi nell' ADO.NET Entity Data Model ? in tal caso nel diagramma delle tabelle, ho controllato (il file si chiama DB.edmx  e tutti i campi hanno la proprietà nullable impsotata a true).

    Se ti riferisci alla classe LT_Lotti è cosi compsota:
        Public Class LT_Lotti
    
            Private _commessa As String
            Private _lotto As Integer
            Private _anticipo As String
            Private _trasmissione As DateTime
            Private _dataconsegna As DateTime
            Private _tipoimballo As String
    
           Public Property Commessa() As String
                Get
                    Return Me._commessa
                End Get
                Set(ByVal value As String)
                    Me._commessa = value
                End Set
            End Property
            Public Property Lotto() As Integer
                Get
                    Return Me._lotto
                End Get
                Set(ByVal value As Integer)
                    Me._lotto = value
                End Set
            End Property
            Public Property Anticipo() As String
                Get
                    Return Me._anticipo
                End Get
                Set(ByVal value As String)
                    Me._anticipo = value
                End Set
            End Property
            Public Property Trasmissione() As Date
                Get
                    Return Me._trasmissione
                End Get
                Set(ByVal value As DateTime)
                    Me._trasmissione = value
                End Set
            End Property
            Public Property DataConsegna() As Date
                Get
                    Return Me._dataconsegna
                End Get
                Set(ByVal value As DateTime)
                    Me._dataconsegna = value
                End Set
            End Property
            Public Property Tipoimballo() As String
                Get
                    Return Me._tipoimballo
                End Get
                Set(ByVal value As String)
                    Me._tipoimballo = value
                End Set
            End Property
    
    End Class
    (ovviamente ne ho tagliata un bel pezzo)
    Se ti riferisci a questa classe, non c'è scritto da nessuna parte che può essere nullable...
    mercoledì 10 febbraio 2010 10:12
  • Scusami ho capito...

    Public Property Trasmissione() As Nullable(Of DateTime)
                Get
                    Return Me._trasmissione
                End Get
                Set(ByVal value As Nullable(Of DateTime))
                    If (value.HasValue = False) Then
                        Me._trasmissione = DateTime.MinValue
                    Else
                        Me._trasmissione = value
                    End If
    
                End Set
    End Property
    Scusami, sono alle prime armi
    mercoledì 10 febbraio 2010 10:29
  • Hai risolto quindi..
    Marca la risposta, per favore.

    Grazie

    Max

    mercoledì 10 febbraio 2010 11:28
  • Si scusa, pensavo di averlo fatto ma mi sa che non lo aveva preso :-)
    Grazie ancora per i consigli e buon lavoro

    mercoledì 10 febbraio 2010 11:38