나는 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
NullReferenceException 오류가 발생합니다.
예외가 발생했습니다 : CLR / System.NullReferenceException Microsoft.EntityFrameworkCore.dll에서 'System.NullReferenceException'형식의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다 : '개체 참조가 개체의 인스턴스로 설정되지 않았습니다.' System.Linq.Enumerable.WhereSelectEnumerableIterator에서
2.MoveNext()
1.EnumeratorExceptionInterceptor.MoveNext ()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
만약 내가 2 열의 라인을 주석 처리하면
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
is string value 모든 열을 필터링하려고합니다. DateTimeColumn2는 데이터베이스의 DateTime 데이터 유형에 있지만 사용자 입력 문자열이므로 DateTimeColumn2를 string으로 변환하고 사용자 값으로 필터링하려고 시도합니다. 어떤 생각, 내가 뭘 잘못하고있는거야?
여기에서 일어나는 일은 ...
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
... ToString("dd.MM.yyyy")
가 지원되지 않습니다.)로 변환 할 수 없으므로 EF-core는 클라이언트 측 평가로 자동 전환됩니다.
그러나 이제 전체 Where
절이 클라이언트 측에서 평가됩니다 (첫 번째 부분 포함)
m.Column1.Contains(model.search.value)
이제이 첫 번째 부분은 null 참조 예외에 취약 해졌습니다. Column1
대해 null
이있는 엔티티가 있습니다.
DateTimeColumn2
술어를 제거하면 전체 명령문을 SQL로 변환하고 데이터베이스에서 평가할 수 있습니다.
DateTimeColumn2 값 중 하나가 null 일 수 있으므로 예외가 throw 된 것으로 생각되면 null이 아닌지 확인하십시오.
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));