C#|| 运算符不能使用空的布尔值

我在我的LINQ中有以下一段代码:

where (tf.Shipped || tf.Ordered || tf.Processed) 

请注意,已发货,有序和已处理都是可空布尔字段

我收到以下消息:

运算符|| 不能应用于'bool'types的操作数? 和“布尔?”

不知道如何解决这个问题,他们需要是可空的布尔值,我需要使用OR(||)。

退后一步,思考问题。 您想要订购窗口小部件的小部件集合,或者窗口小部件已发货,或者窗口部件已经过处理。

有四种可能的状态为您的“有序”的知识:

  • 这个小部件是有序的,我知道 (真)
  • 这个小部件没有订购,我知道 (错误)
  • 这个小部件是有序的, 但我不知道 (null)
  • 这个小部件没有sorting, 但我不知道 (null)

有四个状态,但只有三个值的可能值。 因此,如果“有序”处于空状态,则不知道是否应包含在查询结果中

编译器也不知道。

只有没有足够的信息可用于编译器给你一个具有你想要的语义的查询。 编译器不会猜测,可能会给你不好的结果; 编译器会告诉你这里没有足够的信息,你需要做更多的工作来使查询明确。

你所要做的就是说如果你不知道答案,该怎么办 。 查询“订购,发货或处理的所有小部件”是不可能的,因为一些小部件我们不知道是否被订购,发货或处理,所以我们不知道是否包含它们。 但是查询“ 我知道的所有小部件都是有序的,或者我知道已经发布了,或者我知道已经处理了”是一个编译器可以理解的查询:

 where (tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false) 

这意味着“如果我不知道它是否被运输等,假设它不是”。

您可能想要查询“所有确定已经或可能已经发货,已订购或处理的小部件:

 where (tf.Shipped ?? true) || (tf.Ordered ?? true) || (tf.Processed ?? true) 

当没有足够的信息来给出准确的结果时,编译器不会猜测你想要犯的错误; 编译器可能会猜错,而我们并不是代表你做决定的。 你将不得不做出这个决定。

尝试

  where (tf.Shipped == true || tf.Ordered == true || tf.Processed == true ) 

您需要确保expression式不会为null 。 你可以用null-coalesce操作符来做到这一点, :

 where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false)) 
 where ((tf.Shipped.HasValue && tf.Shipped.Value) || (tf.Ordered.HasValue && tf.Ordered.Value) || (tf.Processed.HasValue && tf.Processed.Value)) 

你也可以在你的特定情况下使用GetValueOrDefault 。

 where (tf.Shipped.GetValueOrDefault() || tf.Ordered.GetValueOrDefault() || tf.Processed.GetValueOrDefault() ) 
 where ((tf.Shipped.HasValue && tf.Shipped.Value) || (tf.Ordered.HasValue && tf.Ordered.Value) || (tf.Processed.HasValue && tf.Processed.Value))