Originariamente inviata da
Veronica80
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!