在Lambda表达式中使用三元运算符

时间:2014-09-18 23:35:25

标签: c# datetime lambda boolean ternary-operator

这是我的代码:

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字段永远不为null。 dateClosed有时为null。 dateClosed更准确,我希望尽可能在该日期进行比较,但是如果dateClosed为null,则需要回溯到dateCreated。

如果我需要提供更多信息,请与我们联系。

提前致谢!

2 个答案:

答案 0 :(得分:4)

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

谓词必须评估为bool。您的x.dateCreatedDateTime?(假设)。您必须在评估为true/false的真实部分中执行某些操作。

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

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

答案 1 :(得分:3)

虽然我相信@TyCobb发布了您遇到问题的正确理由,但我不确定他的答案会给您提供您正在寻找的查询。您似乎想要获取日期并将其与firstOfMonth进行比较?

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

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