带的Lambda表达式和System.Nullable< bool>
本文关键字:bool System Nullable Lambda 表达式 | 更新日期: 2023-09-27 18:01:27
无法编译:
void Foo()
{
using (var db = new BarDataContext(ConnectionString))
{
// baz is type 'bool'
// bazNullable is type 'System.Nullable<bool>'
var list = db.Bars.Where(p => p.baz && p.bazNullable); // Compiler:
// Cannot apply operator '&&' to operands of type
// 'System.Nullable<bool> and 'bool'
}
}
我真的必须通过两次运行来实现这个吗?我首先使用as条件,然后用可空条件遍历列表,或者有更好的干净流畅的最佳实践方法来做到这一点?
p.bazNullable.GetValueOrDefault()
像这样?
db.Bars.Where(p => p.baz && p.bazNullable.HasValue && p.bazNullable.Value);
我不知道Linq-to-Sql是否可以处理。
有两个问题:
由于某些原因,在可空类型上不支持短路&&
。(相关为什么没有解除' bool '上的短路运算符? ?)
第二点是即使c#支持它,你的代码仍然没有意义。Where
需要bool
作为您条件的结果类型,而不是bool?
。因此,您需要决定如何处理baz==true
和bazNullable==null
的情况。
这将导致p.baz && (p.bazNullable==true)
或p.baz && (p.bazNullable!=false)
,这取决于您想要的。
或p.baz && (p.bazNullable??false)
或p.baz && (p.bazNullable??true)
您正在尝试应用逻辑&&对可空bool值的操作。
如果您确定p.bazNullable不为空,那么您可以尝试
var list = db.Bars.Where(p => p.baz && p.bazNullable.Value);
或者如果null值等于false,则尝试
var list = db.Bars.Where(p => p.baz && p.bazNullable.ValueOrDefault(false));
你可以这样做:
var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable == true);
use:
var list = db.Bars.Where(p => p.baz && p.bazNullable.Value);
处理null异常使用:
var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable.Value);
这个怎么样
Where(p => p.baz && (p.bazNullable ?? false));
或
Where(p => p.baz && (p.bazNullable ==null ? false : p.bazNullable.Value));