我這行「演員到值類型‘布爾’失敗,因爲物化值爲null」沒事的時候是空
if (EF.ctx.Searches.Any(x => x.SearchTerm == _searchTerm && x.IpAddress == ip && x.Time > dtRecent))
隨機(很少,非重複性)引發此錯誤
由於物化值爲空,所以強制類型值爲'布爾值'的轉換失敗。結果類型的泛型參數或查詢都必須使用可爲空的類型。
在數據庫中,只有IpAddress可以爲空(但到目前爲止沒有空IpAddress的記錄)。
每次拋出錯誤時,沒有一個變量爲空。
最接近的問題是Queryable.Any() returning null?
但這個錯誤對我來說還是沒有意義的。
我真的很好奇,究竟是什麼null在那一行?
堆棧跟蹤:
在System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader
1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper) at System.Data.Common.Internal.Materialization.Coordinator
1.ReadNextElement(整形器整形器) 在System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable
1個源) at System.Data.Objects.ELinq.ObjectQueryProvider.b__3 [TResult](IEnumerable1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1 query,Expression queryRoot) at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute [S](Expression表達式) at System.Linq.Queryable.Any [TSource](IQueryable1 source, Expression
1謂語) 在[我的代碼,上面的線]
當你說'不可重現'時,你是否要重新測試數據庫,相同的參數等?如果是的話,你可以分析數據庫並執行一些壓力測試來試圖強制這種情況發生嗎?這可能是你最好的機會。 –
很難相信「任何」都會在這裏拋出一些異常。它應該被翻譯成一些sql查詢(使用'EXISTS'),這裏的實現結果只是'bool'轉換而來的'bit'。 SQL查詢應始終返回「0」或「1」。但不知何故,物化不能完成。你可以檢查生成的SQL查詢(儘管我不認爲它可能涉及 - 它應該是直接對db執行並返回0或1)。 –
@KirkBroadhurst是的,在catch塊中,我用相同的參數重新評估表達式,它不會再次拋出異常。我已經嘗試過一個評估表達式失敗的循環,1000s的時間,還沒有能夠重現它。 – Aximili