.Any导致转换为值类型'Boolean'失败,因为实现的值为null

时间:2014-01-15 03:36:27

标签: c# linq lambda

完整的错误消息:

  

转换为值类型'Boolean'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

代码:

 var messages = ctx.tblMessageQueue.Where(o => o.Status == status && o.Region == region);     
 //o.Status is a byte type and not nullable, o.Region is an int type and not nullable.

 if(messages != null && messages.Any()) => Triggers the Error
 {...
 }

StackTrace是:

  

在   System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader 1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper ) 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.Data.Objects.ELinq.ObjectQueryProvider.b__3 [TResult](IEnumerable的1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable 1   查询,表达式queryRoot)at           在System.Linq.Queryable.Any [TSource](IQueryable`1 source)

3 个答案:

答案 0 :(得分:1)

您的tblMessageQueue表中的某个列值可能是NULL,而实体类中的相应属性类型为bool。如果是这种情况,我可以考虑以下两个建议:

  1. 更正数据和表格,使其不包含或允许NULL
  2. 将实体类属性更新为可为空:bool?

答案 1 :(得分:0)

我认为你需要这样的东西:

var messages = ctx.tblMessageQueue.Where(o => o.Status == status && o.Region == region)
                                  .Where(o => o.Status != null);

我不确定语法,但您只需要确保空状态消息不会使其成为新变量。

这是一个示例/类似问题 - Multiple Where clauses in Lambda expressions

答案 2 :(得分:0)

检查Message表中的任何其他属性是否为空值,如果Message表包含可空整数,那么您应该考虑将Message Entity类更改为“int?”类型。