我在LINQ中有以下代码:
where (tf.Shipped || tf.Ordered || tf.Processed)
请注意,Shipped,Ordered和Processed都是可以为空的布尔字段
我收到以下消息:
运营商||不能应用于'bool'类型的操作数?和'布尔?'
不确定如何解决这个问题,它们需要是可以为空的布尔值,我需要使用OR(||)。
答案 0 :(得分:103)
退一步思考问题。您需要一组窗口小部件,其中订购了窗口小部件,或者窗口小部件已发布,或者窗口小部件已处理完毕。
您对“有序”的了解有四种可能的状态:
有四种状态,但只有三种值可能的值。因此,如果“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))