C# &引用;转换为值类型';布尔值';失败,因为具体化的值为null;当没有空值时
我有这条线C# &引用;转换为值类型';布尔值';失败,因为具体化的值为null;当没有空值时,c#,entity-framework,C#,Entity Framework,我有这条线 if (EF.ctx.Searches.Any(x => x.SearchTerm == _searchTerm && x.IpAddress == ip && x.Time > dtRecent)) 随机抛出此错误(很少,不可复制) 转换为值类型“Boolean”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型 在数据库中,只有IpAddress可为空(但到目前为止,没有具有空IpAddress的记录)。 每
if (EF.ctx.Searches.Any(x => x.SearchTerm == _searchTerm && x.IpAddress == ip && x.Time > dtRecent))
随机抛出此错误(很少,不可复制)
转换为值类型“Boolean”失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为空的类型
在数据库中,只有IpAddress可为空(但到目前为止,没有具有空IpAddress的记录)。每次抛出错误时,所有变量都不为null 最接近的类似问题是
但是这个错误对我来说仍然没有意义 我真的很好奇,在那一行中,究竟什么是null 堆栈跟踪: 在System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader
1.GetValue(DbDataReader reader,Int32序数)
lambda_法(闭合、整形器)
在System.Data.Common.Internal.Materialization.Coordinator中
1.ReadNextElement(整形器整形器)
在System.Data.Common.Internal.Materialization.Shaper1.SimpleNumerator.MoveNext()中
at System.Linq.Enumerable.Single[t源](IEnumerable
1源)
在System.Data.Objects.Elink.ObjectQueryProvider.b__3[TResult](IEnumerable1序列)
在System.Data.Objects.Elink.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1查询,表达式queryRoot)
位于System.Data.Objects.Elink.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](表达式)
at System.Linq.Queryable.Any[TSource](IQueryable1源,表达式1谓词)
在[我的代码,上面一行]
在我的例子中,数据库有一些变化,所以我们清理了一些表,就是这样
我的意思是建议修改您的数据库。当您说“不可复制”时,您是否正在使用数据库、相同参数等进行测试?如果是,您是否可以分析数据库并执行一些压力测试以尝试强制执行此操作?这可能是你最好的机会。很难相信任何一个会在这里抛出一些异常。应该将它转换为一些sql查询(使用EXISTS
),这里的物化结果只是从位转换而来的bool
。SQL查询应始终返回0
或1
。但不知何故,物质化无法实现。您可以检查生成的sql查询(尽管我认为它可能不涉及-直接对db执行应该可以,并返回一个0或1位)。@KirkBroadhurst是的,在catch块中,我使用完全相同的参数重新计算表达式,它不会再次抛出异常。我尝试了一个循环,对失败的同一个表达式求值,1000秒的时间,无法复制它。我遇到了完全相同的问题,从我自己的观察中,我在将结果选择到自定义类中时遇到了这个问题。如果我复制了相同的东西,但是使用了动态转换(new{blah=blah…}),那么除了“cast to type Int32”之外,我会得到相同的错误。我的问题是,什么样的参数埋在其他参数中,我不知道它是哪一个。