Ich habe folgenden Linq Code
// 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
Ich erhalte den Fehler " NullReferenceException"
Ausnahme ist aufgetreten: CLR / System.NullReferenceException Eine Ausnahme vom Typ 'System.NullReferenceException' ist in Microsoft.EntityFrameworkCore.dll aufgetreten, wurde aber nicht im Benutzercode behandelt: 'Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt.' bei System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
1.EnumeratorExceptionInterceptor.MoveNext ()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
Wenn ich die Zeile für die zweite Spalte auskommentiert, funktioniert es
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
ist ein String-Wert Ich versuche alle Spalten zu filtern. DateTimeColumn2 befindet sich im DateTime-Datentyp in der Datenbank, jedoch in einer Benutzereingabezeichenfolge, daher konvertiere ich DateTimeColumn2 in eine Zeichenfolge und versuche, auf den Benutzerwert zu filtern. Irgendeine Idee, was ich falsch mache?
Was hier passiert ist, dass der Teil ...
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
... kann nicht in SQL übersetzt werden ( ToString("dd.MM.yyyy")
wird nicht unterstützt), sodass EF-core automatisch zur clientseitigen Auswertung wechselt.
Nun wird jedoch die gesamte Where
Klausel clientseitig ausgewertet, einschließlich des ersten Teils,
m.Column1.Contains(model.search.value)
Jetzt ist dieser erste Teil für Null-Referenz-Ausnahmen anfällig geworden. Es gibt Entitäten mit einer null
für Column1
.
Wenn Sie das Prädikat DateTimeColumn2
entfernen, DateTimeColumn2
die gesamte Anweisung in SQL übersetzt und von der Datenbank ausgewertet werden.
Wenn Sie der Meinung sind, dass die Ausnahme ausgelöst wird, weil einer der DateTimeColumn2-Werte möglicherweise null ist, prüfen Sie, ob eine Nicht-Nullheit vorliegt:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));