Nat*_*Pet 41 c# boolean nullable
我的LINQ中有以下代码:
where (tf.Shipped || tf.Ordered || tf.Processed)
Run Code Online (Sandbox Code Playgroud)
请注意,Shipped,Ordered和Processed都是可以为空的布尔字段
我收到以下消息:
运营商|| 不能应用于'bool'类型的操作数?和'布尔?'
不知道如何解决这个问题,他们需要是可以为空的布尔值,我需要使用OR(||).
Eri*_*ert 103
退一步思考问题.您需要一组窗口小部件,其中订购了窗口小部件,或者窗口小部件已发布,或者窗口小部件已处理完毕.
您对"有序"的了解有四种可能的状态:
有四种状态,但只有三种值可能的值.因此,如果"ordered"处于null状态,则不知道它是否应包含在查询结果中.
编译器也不知道.
根本没有足够的信息可供编译器为您提供具有所需语义的查询.编译器不会猜测,可能会给你不好的结果; 编译器会告诉你这里没有足够的信息,你需要做更多的工作才能使查询明确无误.
你要做的就是在你不知道答案的情况下说明该怎么做.查询"所有已订购,装运或处理的小部件"是不可能的,因为有些小部件我们不知道它们是否被订购,运输或处理,因此我们不知道是否包括它们.但是查询" 我所知道的所有小部件都被订购了,或者我知道这些小部件都已发货,或者我知道这些小部件已被处理"是一个查询,编译器可以理解:
where (tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false)
Run Code Online (Sandbox Code Playgroud)
这意味着"如果我不知道它是否已发货等,则认为不是".
您可能希望查询"所有肯定是,或者可能已经发货,订购或处理过的小部件:
where (tf.Shipped ?? true) || (tf.Ordered ?? true) || (tf.Processed ?? true)
Run Code Online (Sandbox Code Playgroud)
当没有足够的信息来提供准确的结果时,编译器不会猜测你想要错误的那一方; 编译器可能猜错了,我们不代表您做出决定.你将不得不做出这个决定.
500*_*ror 39
尝试
where (tf.Shipped == true || tf.Ordered == true || tf.Processed == true )
Run Code Online (Sandbox Code Playgroud)
ade*_*hus 18
您需要确保表达式永远不会null
.您可以使用null-coalesce运算符执行此操作??
:
where ((tf.Shipped ?? false) || (tf.Ordered ?? false) || (tf.Processed ?? false))
Run Code Online (Sandbox Code Playgroud)
where ((tf.Shipped.HasValue && tf.Shipped.Value)
|| (tf.Ordered.HasValue && tf.Ordered.Value)
|| (tf.Processed.HasValue && tf.Processed.Value))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2021 次 |
最近记录: |