C#||操作员不使用可空的布尔值

时间:2012-01-27 17:04:07

标签: c# nullable boolean

我在LINQ中有以下代码:

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

请注意,Shipped,Ordered和Processed都是可以为空的布尔字段

我收到以下消息:

  

运营商||不能应用于'bool'类型的操作数?和'布尔?'

不确定如何解决这个问题,它们需要是可以为空的布尔值,我需要使用OR(||)。

6 个答案:

答案 0 :(得分:103)

退一步思考问题。您需要一组窗口小部件,其中订购了窗口小部件,或者窗口小部件已发布,或者窗口小部件已处理完毕。

您对“有序”的了解有四种可能的状态:

  • 此小部件已订购,我知道(true)
  • 此小部件未订购,我知道(false)
  • 此小部件已订购,但我不知道(null)
  • 此小部件未订购但我不知道(null)

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

编译器也不知道。

根本没有足够的信息可供编译器为您提供具有所需语义的查询。编译器不会猜测并可能给您带来不良结果;编译器会告诉你这里没有足够的信息,你需要做更多的工作才能使查询明确无误。

您需要做的是说在您不知道答案的情况下该怎么做。查询“所有已订购,发运或处理的小部件”是不可能的,因为某些小部件我们不知道是否已订购,发货或处理,因此我们不知道是否包括他们与否。但查询“我所知道的所有小部件 已被订购,或我知道已发货,或我知道已处理”是查询编译器可以理解:

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

这意味着“如果我不知道它是否已发货等,则假设它不是”。

您可能希望查询“肯定已经或可能已经运送,订购或处理的所有小部件:

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

当没有足够的信息来提供准确的结果时,编译器不会猜测你想犯错哪一方;编译器可能猜错了,我们不代表你做决定。你将不得不做出这个决定。

答案 1 :(得分:39)

尝试

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

答案 2 :(得分:18)

您需要确保表达式永远不会null。您可以使用null-coalesce运算符??

执行此操作
where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false))

答案 3 :(得分:5)

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

答案 4 :(得分:2)

您也可以在特定情况下使用GetValueOrDefault

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

答案 5 :(得分:1)

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