C# 是否有()返回null?

C# 是否有()返回null?,c#,entity-framework,C#,Entity Framework,我有一个数据库查找,如: var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true"); if(configs.Any()) { ... } 其中configs作为IQueryable类型返回。我有时会遇到这样的错误: System.InvalidOperationException:转换为值类型“Boolean” 由于物化值为null,因此失败。要么是结

我有一个数据库查找,如:

var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true");
if(configs.Any())
{ ... }
其中configs作为IQueryable类型返回。我有时会遇到这样的错误:

System.InvalidOperationException:转换为值类型“Boolean” 由于物化值为null,因此失败。要么是结果 类型的泛型参数或查询必须使用可为空的类型。在 System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader
1.GetValue(DbDataReader
读卡器,Int32序数)
System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32
序号)at
系统、数据、公共、内部、物化、协调器
成型机)在
System.Data.Common.Internal.Materialization.Shaper
1.simplenumerator.MoveNext()
at System.Linq.Enumerable.Single[t源](IEnumerable
1源)at System.Linq.Queryable.Any[TSource](IQueryable`1 source)

它发生在生产中,似乎是随机的,我还没有能够在开发中复制它


编辑以添加:配置类型有一个外键约束,如果布尔类型是从该约束强制转换的,我不知道。Entity Framework创建的配置类型中没有布尔值,Sql Server中也没有布尔值类型。

您的Configs表中的某些数据库列具有可为空的布尔值类型,但将表项映射到的C#实体被定义为使用不可为空的布尔值。当查询提供程序填充C#实体时,当它遇到
null
值时,它抛出此异常。您需要更新实体对象,以使所讨论的列具有正确的类型。

以下是我的理论,基于
e.flag
是一个可空列的事实:我认为当
e.flag
为空时,您会遇到此错误,因为
null
值通过谓词传播,并使其在SQL端最终为null,即使在编译时C#表达式的类型是
bool
而不是
bool?
。当EF试图具体化它抛出的值时

如果我是对的,将谓词更改为以下将修复它:

var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && (e.flag ?? "") == "true");

如果要复制它,请在预期配置没有结果时尝试复制它。总是存在一些配置,它们可能与条件不匹配?或者,
dbData.Configs
可能完全为空?什么是
headers
它可以有多大以及实体框架的哪个版本?@Mangist,如果没有记录,Any()将返回false,而不是异常;-)@管理列表如果没有记录,它不会失败,它会返回
false
,因为没有项目。它正是这项工作的正确工具,并且优于使用
Count
,因为它可以在找到单个项目后立即短路。嗯。。。但这不会导致
Any
返回0吗?@AndrewBarber否。在
Any
的实现过程中,它尝试获取结果集中的第一项。如果能够成功获取该项,则返回
true
。如果它成功确定没有项目,则返回
false
。如果在获取第一个项目时发生错误,则
Any
会传播该错误。他们是否可以以不同的方式实现它,当然,像这样实现它是错误的,我不会这么说。他最终还是需要解决这个问题。@AndrewBarber我认为如果它不能映射实体类型,那么它会立即失败;它甚至没有尝试评估
Any()
。另外,
Any()
返回
bool
,因此它不能返回0。在EF6下,这种查询不会在生成的SQL(select)中使用列名称,因此如果
Config
对象在存在列bool时使用bool?在桌子上,它不会matter@Fredou嗯,错误消息表明这正是发生的情况。可能OP使用的查询提供程序与您不同。我尝试在数据库中将flag设置为null,但仍然无法触发错误。不过,我会在这方面做更多的测试。只有软件工程师才会说:“如果我能让这个东西失败,那就太棒了。”