【问题标题】:Using Ternary Operator within Lambda Expression在 Lambda 表达式中使用三元运算符
【发布时间】:2014-11-13 11:15:28
【问题描述】:

这是我的代码:

var now = DateTime.Now;
var firstOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 1);

var objectsAfterFirstOfThisMonth= _context.DataObjects
    .Where(x => x.dateClosed == null ? x.dateClosed : x.dateCreated > firstOfMonth);

我得到以下编译错误:

'System.Nullable' 和 'bool' 之间没有隐式转换

我对 lambda 语法的理解不足以理解此错误。

如果我无法使用这种三元语法,那么我将需要从数据库中获取 DataObjects 的完整列表,然后遍历该列表,创建过滤列表(那些日期晚于当月第一天的对象) 我去。

简而言之,我的目标是:我想获取本月第一天之后发生的所有对象。 dateCreated 字段永远不会为空。 dateClosed 有时为空。 dateClosed 更准确​​,我想尽可能多地比较该日期,但如果 dateClosed 为空,则需要退回到 dateCreated。

如果我需要提供更多信息,请告诉我。

提前致谢!

【问题讨论】:

  • 编译器清楚地告诉你哪里出了问题。

标签: c# datetime lambda boolean ternary-operator


【解决方案1】:
....Where(x => x.dateCreated == null ? x.dateCreated : x.dateClosed > firstOfMonth);

谓词必须计算为bool。您的x.dateCreated 是DateTime?(假设)。您必须在评估为 true/false 的真实部分中做一些事情。

类似下面的内容应该可以编译,但仅作为示例。我不确定你的实际逻辑应该是什么,因为你说dateCreated 永远不会为空,但你正在检查空。请注意,这些都评估为真/假值。

....Where(x => x.dateCreated == null ? 
                       x.dateCreated.HasValue :
                       x.dateClosed > firstOfMonth);

【讨论】:

    【解决方案2】:

    虽然我相信@TyCobb 发布了您遇到问题的正确原因,但我不确定他的回答是否会为您提供您正在寻找的问题。您似乎想获取一个日期并将其与firstOfMonth 进行比较?

    如果是这样,我想你可能想要这样的东西:

    var objectsAfterFirstOfThisMonth= _context.DataObjects
        .Where(x => (x.dateCreated != null ? x.dateCreated.Value : x.dateClosed) > firstOfMonth);
    

    【讨论】:

    • 这解决了我想要做的事情!感谢您尝试了解我的问题的背景。
    • 我只是不明白逻辑应该是什么,因为据说 dateCreated 永远不会为空,但它正在检查空。认为空值更像是谓词之外的安全检查。
    猜你喜欢
    • 2022-01-21
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2019-02-10
    • 2013-01-16
    • 2012-09-02
    相关资源
    最近更新 更多