C#|| 运算符不使用可为空的布尔值
我的LINQ中有以下代码:
where (tf.Shipped || tf.Ordered || tf.Processed)
请注意,“已发货”,“已订购”和“已处理”都是可空的布尔字段
我收到以下消息:
运算符|| 不能应用于类型为“布尔”的操作数? 和“布尔?”
不确定如何将其解决,因为它们需要为可为null的布尔值,而我需要使用OR(||)。
Nate Pet asked 2020-08-12T06:16:59Z
6个解决方案
103 votes
退后一步,思考问题。 您需要订购小部件,运输小部件或处理小部件的小部件集合。
对于“有序”知识,有四种可能的状态:
- 这个小部件是有序的,我知道(是)
- 此小部件未订购,我知道(假)
- 此小部件已订购,但我不知道(空)
- 此小部件未订购,但我不知道(空)
有四个状态,但只有三个值可能的值。 因此,如果“ ordered”处于空状态,则您不知道是否应将其包括在查询结果中。
编译器也不知道。
根本没有足够的信息可用于编译器来提供具有所需语义的查询。 编译器不会猜测,可能会给您带来不好的结果。 编译器将告诉您这里没有足够的信息,您需要做更多的工作才能使查询明确。
您要做的就是说在不知道答案的情况下该怎么做。 查询“所有已订购,已发货或已处理的小部件”是不可能的,因为某些小部件我们不知道是否已订购,已发货或已处理,因此我们不知道是否包含它们。 但是查询“我知道的所有小部件都已订购,或者我知道的所有小部件都已发货,或者我知道已处理”是一个编译器可以理解的查询:
where (tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false)
这意味着“如果我不知道它是否已发货,请假设不是。”
您可能需要查询“所有确实是或者可能已经发货,订购或处理过的小部件:
where (tf.Shipped ?? true) || (tf.Ordered ?? true) || (tf.Processed ?? true)
当没有足够的信息来给出准确的结果时,编译器不会猜测要在哪一侧出错。 编译器可能会猜错,我们不代表您做决定。 您将不得不做出决定。
39 votes
尝试
where (tf.Shipped == true || tf.Ordered == true || tf.Processed == true )
18 votes
您需要确保表达式永远不会是null
。您可以使用null-coalesce运算符??
进行以下操作:
where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false))
5 votes
where ((tf.Shipped.HasValue && tf.Shipped.Value)
|| (tf.Ordered.HasValue && tf.Ordered.Value)
|| (tf.Processed.HasValue && tf.Processed.Value))
2 votes
您也可以在特定情况下使用GetValueOrDefault。
where (tf.Shipped.GetValueOrDefault()
|| tf.Ordered.GetValueOrDefault()
|| tf.Processed.GetValueOrDefault() )
1 votes
where ((tf.Shipped.HasValue && tf.Shipped.Value)
|| (tf.Ordered.HasValue && tf.Ordered.Value)
|| (tf.Processed.HasValue && tf.Processed.Value))