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

C# 在Lambda表达式中使用三元运算符,c#,datetime,lambda,boolean,ternary-operator,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); 我得到以

这是我的密码:

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语法理解不够,无法理解此错误

如果我不能使用这个三元语法,那么我将需要从数据库中获取数据对象的完整列表,然后遍历这个列表,在运行时创建过滤列表(日期晚于当前月份的第一个对象)

简而言之,我的目标是:我希望得到本月1日之后发生的所有对象。dateCreated字段从不为空。dateClosed有时为空。dateClosed更准确,我希望尽可能多地比较该日期,但需要返回dateCreated,以防dateClosed为空

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

提前谢谢

....Where(x => x.dateCreated == null ? x.dateCreated : x.dateClosed > firstOfMonth);
谓词必须求值为
bool
。您的
x.dateCreated
DateTime?
(假设)。您必须在计算结果为
true/false
的真实部分执行某些操作

类似下面的内容应该可以编译它,但只是作为一个示例。我不确定您的实际逻辑应该是什么,因为您说
dateCreated
从不为null,但您正在检查null。请注意,这些值的计算结果都是真/假

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

虽然我相信@TyCobb发布了您出现问题的正确原因,但我不确定他的回答是否会给出您所寻找的问题。您似乎想获取一个日期,并将其与月初进行比较

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

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

编译器很清楚地告诉你出了什么问题。这解决了我想做的事情!谢谢你试着理解我问题的上下文。我只是不明白逻辑应该是什么,因为据说dateCreated从不为null,但它正在检查null。我认为空值更像是谓词之外的安全检查。