Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109

    [VB.NET] - Errore su alcuni campi di un entità come se fossero nothing

    Ciao a tutti,
    mi scuso per il titolo ma non saprei veramente come sintetizzare il problema.

    Sto usando Entity Frameworks per collegarmi al mio DB MySQL, nella fattispeci in oggetto ad una view in sola lettura che viene visualizzata come entità nel mio progetto.

    Io filtro i risultati della lettura in questo modo:

    codice:
     Dim lista = From c In listaCom
                             Where c.nome_Com.StartsWith(TextBox2.Text) And
                                      c.codCatastale_Com.StartsWith(miaStr)
                             Order By c.nome_Com
                             Select c
    e ricevo questo errore sul campo c.codCatastale_Com:

    System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'
    Prova_EF_Lions.dgv_comuni.codCatastale_Com.get ha restituito Nothing.

    La cosa strana è se invece che usare il .startWith() uso (per esempio) una comparazione semplice tipo: c.codCatastale_Com = miaStr
    Funziona senza errori...

    Per comodità ho riportato solo questo campo ma ho visto che succede anche con altri campi dell'entità...(solo alcuni)

    Avete idea di cosa possa trattarsi?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    Update:
    Ho notato che il problema insorge sui campi del db che hanno valore NULL...non mi dite che anche EF non gestisce i NULL perchè mi uccido!

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Update:
    Ho notato che il problema insorge sui campi del db che hanno valore NULL...non mi dite che anche EF non gestisce i NULL perchè mi uccido!
    Il problema è sempre lo stesso: la sintassi LINQ è sempre uguale ma il comportamento cambia a seconda del "motore" a cui l'espressione viene passata.

    Prendiamo l'espressione che hai scritto come esempio, che ho semplificato per ragionarci:
    codice:
    From c In insiemeOggetti
    Where c.nome_Com.StartsWith("valore1") And c.codCatastale_Com.StartsWith("valore2")
    Order By c.nome_Com
    Select c
    Prendendo l'espressione sopra, quando insiemeOggetti è rappresentato dalla proprietà che ha lo stesso nome della tabella e appartiene a IDbContext, stai costruendo una espressione che verrà passata a EF e verrà analizzata per trasformarla nello statement SQL che restituisce i risultati attesi; ciò significa che l'espressione sopra diventerà qualcosa di questo tipo:
    codice:
    SELECT * FROM insiemeOggetti
    WHERE nome_Come LIKE 'valore1%' AND codCatastale_Com LIKE 'valore2%'
    ORDER BY nome_Com
    Una volta eseguita la query, i record ottenuti vengono trasformati in oggetti e restituiti al tuo programma, ad esempio una lista (se chiami il metodo GetList).

    Questo fa sì che se il campo incluso nel filtro è NULL, la condizione è sempre falsa (seguendo le regole di SQL) e il record non ti viene restituito.

    Nel tuo caso la NullReferenceException si verifica perché tu hai la lista di oggetti (intesi come oggetti C#) a cui applichi l'espressione LINQ indicata sopra: in questo caso, insiemeOggetti non è più l'oggetto di EF di partenza di cui parlavamo prima, ma è una semplice lista di oggetti C#.

    La sintassi LINQ funziona comunque, ma in questo caso sta a indicare una operazione da eseguire appunto su una lista di oggetti C# nell'ambito del .NET Framework, e noi sappiamo che se chiami il metodo StartWith su una proprietà di tipo String che però non contiene un valore, cioè è null, allora è normale che ti venga restituita una NullReferenceException, giusto?

    In breve, quando tu hai eseguito la query su DB tramite l'espressione LINQ, Entity Framework ti restituisce gli oggetti corrispondenti e il suo lavoro è terminato: da qui in poi valgono le regole del CLR del .NET Framework.

    Nell'espressione devi quindi per forza aggiungere il controllo che non sia Nothing, tipo:
    codice:
    From c In insiemeOggetti
    Where c.nome_Com Is Not Nothing AndAlso c.nome_Com.StartsWith("valore1") AndAlso c.codCatastale_Com Is Not Nothing AndAlso c.codCatastale_Com.StartsWith("valore2")
    Order By c.nome_Com
    Select c
    Fammi sapere se è chiaro il concetto, anche perché ti ci sei già scontrata quattro o cinque volte.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    Ahahahah si il concetto è chiaro! Il problema è che ogni volta mi trovo ad usare LINQ in contesti esterni agli E.F. e non capisco mai bene dove finisce un contesto ed inizia l'altro!

    Mi ci vorrebbe un bel corso passo passo o una guida completa sugli E.F. in modo da capire quando con LINQ sto sforando dal loro campo!

  5. #5
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,109
    A sto punto però mi sorge spontanea una domanda:

    Apportando le modifiche di verifica del valore NULL non escludo dai risultati tutti i record che hanno quei campi come NULL?
    Perchè a me serve che ci siano anche quelli quando la stringa che passo a startsWith() è = ""

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Ahahahah si il concetto è chiaro! Il problema è che ogni volta mi trovo ad usare LINQ in contesti esterni agli E.F. e non capisco mai bene dove finisce un contesto ed inizia l'altro!
    E' semplice: basta vedere qual è il tipo che sta alla destra della parte From...In dell'espressione LINQ.

    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Apportando le modifiche di verifica del valore NULL non escludo dai risultati tutti i record che hanno quei campi come NULL?
    Escludi dai risultati gli oggetti che hanno il campo valorizzato a Nothing, che è il valore C# corrispondente ai valori NULL del campo.

    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Perchè a me serve che ci siano anche quelli quando la stringa che passo a startsWith() è = ""
    Quando la stringa che passi a quel filtro è vuota, devi ottenere tutti i record.
    Ergo conviene semplicemente evitare di applicare quel filtro quando non c'è alcun valore per cui filtrare.

    Avevamo già visto una casistica simile in una precedente discussione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.