我有以下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
如果我註釋掉第二列的行,它就可以了
//|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
model.search.value
是字符串值我試圖過濾所有列。 DateTimeColumn2是數據庫中的DateTime數據類型,但是用戶輸入字符串,因此我將DateTimeColumn2轉換為字符串並嘗試過濾到用戶值。任何想法,我做錯了什麼?
這裡發生的是那部分......
|| m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)
...無法轉換為SQL(不支持ToString("dd.MM.yyyy")
),因此EF-core自動切換到客戶端評估。
但是,現在整個Where
子句被評估為客戶端,包括第一部分,
m.Column1.Contains(model.search.value)
現在,第一部分變得容易受到空引用異常的影響。 Column1
實體為null
。
刪除DateTimeColumn2
謂詞時,整個語句可以轉換為SQL並由數據庫進行評估。
如果您認為由於任何DateTimeColumn2值可能為null而拋出異常,請檢查非nullness:
query = query.Where(m => ...
|| (m.DateTimeColumn2 != null &&
m.DateTimeColumn2.ToString("dd.MM.yyyy").StartsWith(model.search.value)));