Ho seguito il codice Linq
// query = IQueryable<DataClass>
query = query.Where(m => m.Column1.Contains(model.search.value)
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value));
return query.ToList() // here the error is thrown
Ottengo l'errore NullReferenceException
Si è verificata un'eccezione: CLR / System.NullReferenceException Un'eccezione di tipo 'System.NullReferenceException' si è verificata in Microsoft.EntityFrameworkCore.dll ma non è stata gestita nel codice utente: 'Riferimento oggetto non impostato su un'istanza di un oggetto.' a System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
1.EnumeratorExceptionInterceptor.MoveNext ()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
se ho commentato la linea per la 2a colonna funziona
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
è un valore stringa Sto tentando di filtrare tutte le colonne. DateTimeColumn2 è nel tipo di dati DateTime nel database, ma stringa di input dell'utente, pertanto Iam converte DateTimeColumn2 in stringa e tenta di filtrare il valore degli utenti. Qualche idea, cosa sto facendo male?
Quello che succede qui è che la parte ...
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
... non può essere tradotto in SQL ( ToString("dd.MM.yyyy")
non è supportato), quindi l'auto-switch EF-core passa alla valutazione lato client.
Tuttavia, ora l'intera clausola Where
viene valutata lato client, inclusa la prima parte,
m.Column1.Contains(model.search.value)
Ora questa prima parte è diventata suscettibile alle eccezioni di riferimento null. Esistono entità con valore null
per Column1
.
Quando si rimuove il predicato DateTimeColumn2
l'intera istruzione può essere tradotta in SQL e valutata dal database.
Se si ritiene che l'eccezione venga generata a causa di uno qualsiasi dei valori DateTimeColumn2 potrebbe essere nullo, verificare la non nullità:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));