Queryable.Any() returning null?
本文关键字:null returning Any Queryable | 更新日期: 2023-09-27 18:17:41
我有一个数据库查找:
var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true");
if(configs.Any())
{ ... }
,其中configs作为可查询类型返回。我有时会遇到这样的错误:
系统。InvalidOperationException:转换为值类型"布尔"失败,因为物化值为空。要么是结果类型的泛型参数,否则查询必须使用可空类型。在system . data . common . internal . materialise . shaper . errorhandlingvaluereader
1.GetValue(DbDataReader reader, Int32 ordinal) at System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32 ordinal) at System.Data.Common.Internal.Materialization.Coordinator
ReadNextElement(牛头刨床牛头刨床)system . data . common . internal . materialise . shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable
1源)atSystem.Linq.Queryable。任何[TSource](这个IQueryable ' 1源)
它发生在生产中,似乎是随机的,我还没能在开发中重现它。
EDIT TO ADD:配置类型有一个外键约束,如果布尔类型正在从中转换,我不知道。实体框架创建的配置类型中没有布尔值,Sql Server中也没有布尔值
您的Configs表中有一些数据库列具有可空的布尔类型,但是您将表条目映射到的c#实体被定义为使用非空布尔值。当c#实体被查询提供程序填充时,当它运行到一个null
值时,它抛出这个异常。您需要更新实体对象,使所讨论的列具有正确的类型。
这是我的理论,基于e.flag
是一个可空列的事实:我认为当e.flag
为空时,你会得到这个错误,因为null
值通过你的谓词传播,并使其最终在SQL方面为空,即使在编译时c#表达式的类型是bool
而不是bool?
。当EF试图具体化该值时,它抛出。
如果我是对的,将谓词更改为以下将修复它:
var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && (e.flag ?? "") == "true");