我有一个数据库查找,如:
var configs = dbData.Configs.Where(e => headers.Contains(e.headerId) && e.flag == "true");
if(configs.Any())
{ ... }
其中configs作为IQueryable类型返回。我有时会收到这个错误:
System.InvalidOperationException:转换为值类型'布尔' 失败,因为具体化值为null。要么结果 类型的通用参数或查询必须使用可空类型。在 System.Data.Common.Internal.Materialization.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
1.ReadNextElement(整形器 塑造者 System.Data.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable
1 source)at System.Linq.Queryable.Any [TSource](IQueryable`1 source)
它发生在生产中,看似随机,我无法在开发中重现它。
EDIT TO ADD:Config类型有一个外键约束,如果从中投射布尔类型,我不知道。实体框架创建的Config类型中没有布尔值,无论如何在Sql Server中都没有布尔类型。
答案 0 :(得分:2)
您的Configs表中有一些具有可为空的布尔类型的数据库列,但是您将表条目映射到的C#实体定义为使用不可为空的布尔值。当查询提供程序正在填充C#实体时,当它遇到null
值时,它会抛出此异常。您需要更新实体对象,以便相关列的类型正确。
答案 1 :(得分:0)
这是我的理论,基于e.flag
是一个可以为空的列的事实:我认为当e.flag
为空时,您会收到此错误,因为{{值传播通过谓词并使其在SQL端最终为空,即使在编译时C#表达式的类型为null
而不是bool
。当EF试图实现它抛出的值时。
如果我是对的,将谓词更改为以下内容将解决它:
bool?