【问题标题】:Lambda expression with <bool> and System.Nullable<bool>带有 <bool> 和 System.Nullable<bool> 的 Lambda 表达式
【发布时间】:2011-07-08 09:24:44
【问题描述】:

这无法编译:

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 条件,然后使用可以为空的条件运行该列表,还是有更好的干净流畅的最佳实践方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:
    p.bazNullable.GetValueOrDefault()
    

    【讨论】:

    • 这个+1。好的。我不知道有GetValueOrDefault
    • 我无法在 LINQ 查询中使用 GetValueOrDefault,但显式添加 == true 有效。
    • 您可以像这样在 GetValueOrDefault(false) 中传递一个默认值。如果 bool 包含空值,它将返回 false。在 LINQ where 子句中极大地帮助了我。
    【解决方案2】:

    这样的?

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

    不知道Linq-to-Sql能不能处理。

    【讨论】:

      【解决方案3】:

      这里有两个问题:

      由于某种原因,可空类型不支持短路&amp;&amp;。 (相关Why are there no lifted short-circuiting operators on `bool?`?

      第二个是即使它被 C# 支持,你的代码仍然没有意义。 Where 需要 bool 作为条件的结果类型,而不是 bool?。所以你需要决定应该如何处理baz==truebazNullable==null的情况。

      这会导致p.baz &amp;&amp; (p.bazNullable==true)p.baz &amp;&amp; (p.bazNullable!=false),这取决于您想要什么。

      或者p.baz &amp;&amp; (p.bazNullable??false)p.baz &amp;&amp; (p.bazNullable??true)

      【讨论】:

        【解决方案4】:

        您正在尝试将逻辑 && 操作应用于可为空的布尔值。

        如果你确定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));
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

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

          【讨论】:

          • 检查 HasValue 要简单得多,但也可以。
          【解决方案6】:

          使用:

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

          【讨论】:

            【解决方案7】:

            这个怎么样

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

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

            【讨论】:

            • 使用可为空的 HasValue 而不是只检查空值可能更安全吗?示例: Where(p => p.baz && (p.bazNullable.HasValue && p.bazNullable.Value));
            猜你喜欢
            • 2010-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多