Lambda表达式与<bool>和System.Nullable <bool> </bool> </bool>

时间:2011-07-08 09:24:45

标签: c# linq-to-sql lambda expression nullable

这无法编译:

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条件,然后使用可空的条件运行该列表,或者是否有更好的干净顺利的最佳实践方法来执行此操作?

7 个答案:

答案 0 :(得分:8)

p.bazNullable.GetValueOrDefault()

答案 1 :(得分:5)

这样的东西?

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

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

答案 2 :(得分:3)

这里有两个问题:

由于某种原因,可空类型不支持短路&&。 (相关Why are there no lifted short-circuiting operators on `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)

答案 3 :(得分:1)

您正在尝试应用逻辑&amp;&amp;操作可空的布尔。

如果您确定p.bazNullable不为null,则可以尝试

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));

答案 4 :(得分:0)

使用:

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

要处理空异常,请使用:

  var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable.Value);

答案 5 :(得分:0)

你可以这样做:

var list = db.Bars.Where(p => p.baz && p.bazNullable != null && p.bazNullable == true);

答案 6 :(得分:0)

这个怎么样

Where(p => p.baz && (p.bazNullable ?? false));

OR

Where(p => p.baz && (p.bazNullable ==null ? false : p.bazNullable.Value));