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.CoordinatorReadNextElement(牛头刨床牛头刨床)system . data . common . internal . materialise . shaper 1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable 1源)atSystem.Linq.Queryable。任何[TSource](这个IQueryable ' 1源)

它发生在生产中,似乎是随机的,我还没能在开发中重现它。

EDIT TO ADD:配置类型有一个外键约束,如果布尔类型正在从中转换,我不知道。实体框架创建的配置类型中没有布尔值,Sql Server中也没有布尔值

Queryable.Any() returning null?

您的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");