2011-07-08 56 views
2

这不能编译:Lambda表达式与<bool>和System.Nullable <bool>

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' 
    } 
} 

我真的有过两分,我第一次使用的条件,然后通过该列表与运行,使这个可空条件,还是有更好的干净平滑的最佳实践方式来做到这一点?

回答

8
p.bazNullable.GetValueOrDefault() 
+0

+1这一个。不错。我不知道有'GetValueOrDefault'。 –

+0

我无法在LINQ查询中使用'GetValueOrDefault',但明确地添加了'== true'。 – Vivelin

+0

您可以在GetValueOrDefault(false)中传递默认值。 如果bool包含空值,它将返回false。在LINQ where条款中帮助我极大。 –

5

这样的事情?

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

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

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

见更新:) –

1

你想申请一个逻辑& &操作为可空布尔。

如果您确信p.bazNullable不为空,那么你可以尝试

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

,或者一个空值等于假,然后尝试

var list = db.Bars.Where(p => p.baz && p.bazNullable.ValueOrDefault(false)); 
0

,你可以只是做:

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

检查'HasValue'要简单得多,但也可以。 –

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)

0

这个怎么样

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

OR

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

@radbyx是否为您更新了工作? – V4Vendetta

+0

使用可为空的HasValue而不是仅检查空值会更安全吗?例如: 其中(p => p.baz &&(p.bazNullable.HasValue && p.bazNullable.Value)); –