的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条件,然后用可空条件遍历列表,或者有更好的干净流畅的最佳实践方法来做到这一点?

带<bool>的Lambda表达式和System.Nullable< bool>

p.bazNullable.GetValueOrDefault()

像这样?

 db.Bars.Where(p => p.baz && p.bazNullable.HasValue && p.bazNullable.Value);

我不知道Linq-to-Sql是否可以处理。

有两个问题:

由于某些原因,在可空类型上不支持短路&&。(相关为什么没有解除' bool '上的短路运算符? ?)

第二点是即使c#支持它,你的代码仍然没有意义。Where需要bool作为您条件的结果类型,而不是bool?。因此,您需要决定如何处理baz==truebazNullable==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));