Queryable.Any()返回null?

时间:2014-08-11 14:52:14

标签: c# entity-framework

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

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.Shaper 1.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中都没有布尔类型。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

如果我是对的,将谓词更改为以下内容将解决它:

bool?