这无法编译:
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条件,然后使用可空的条件运行该列表,或者是否有更好的干净顺利的最佳实践方法来执行此操作?
答案 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==true
和bazNullable==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));