Sto utilizzando una query Linq per ottenere i clienti e il loro indirizzo principale opzionale (un cliente può avere zero o più indirizzi). La gerarchia di oggetti è la seguente:query Linq NullReferenceException su più join a sinistra (a cascata)
- clienti
- CustomerAddress (contiene booleana proprietà principale)
- Indirizzo
- CustomerAddress (contiene booleana proprietà principale)
Questa è la domanda che sto usando :
Quando lo eseguo su un database (tramite EF) restituisce i valori correttamente. Quando lo eseguo in un contesto di simulazione con oggetti di memoria, ottengo un valore NullReferenceException : Riferimento oggetto non impostato su un'istanza di un oggetto.
sono stato in grado di correggere questo errore controllando per un valore nullo nel secondo LEFT JOIN perché la prima a sinistra join restituisce valori nulli:
join add in GetDBContext(c).address on new { addr_code = cusadd == null ? null : cusadd.Addr_Code } equals new { addr_code = add.Addr_Code } into grpadd
Ho trovato un blogpost con la stessa conclusione, ma nessuna spiegazione: http://technologycraftsmen.net/blog/2010/04/14/multiple-outer-joins-in-linq-to-sql/
Perché questa query non funziona sugli oggetti locali e non su un database?
I join esterni a sinistra della cascata devono sempre essere scritti in questo modo in Linq?
Grazie per il vostro feedback!
Grazie per la risposta! Conclusione: se la query di Linq verrà eseguita sia su un database che nel CLR, la query dovrebbe gestire i problemi con entrambi i casi. L'operatore di propagazione nulla potrebbe in effetti fornire un codice più pulito. –
Ottima risposta, mi sono imbattuto in questo io stesso con test dato una rappresentazione in memoria. La difficoltà consiste nell'assicurarsi che non si utilizzi un metodo o un operatore che non è traducibile nel database, altrimenti finirà per lanciare o tornare più dal database, quindi dovrebbe quindi eseguire il codice CLR sul filtro futuro. –