C# 在lambda表达式中强制转换可为null的日期时间

C# 在lambda表达式中强制转换可为null的日期时间,c#,asp.net-mvc,entity-framework-6,C#,Asp.net Mvc,Entity Framework 6,使用EF6,我想从我的数据库日历中获取2019年的所有对象,但EF6生成了可为空的DateTimes“DateTime”,而不是通常的DateTimes。因为我只想要年份,所以我可以使用DateTime中的year字段来筛选我的列表,但DateTime不能为空。基本上我想这样使用它: _db.CALENDRIERs.Where(c => c.CALE_DATE.Year == year).ToList(); 但我得到了以下错误: “DateTime?”不包含“Year”的定义,并且找不到

使用EF6,我想从我的数据库日历中获取2019年的所有对象,但EF6生成了可为空的DateTimes“DateTime”,而不是通常的DateTimes。因为我只想要年份,所以我可以使用DateTime中的year字段来筛选我的列表,但DateTime不能为空。基本上我想这样使用它:

_db.CALENDRIERs.Where(c => c.CALE_DATE.Year == year).ToList();
但我得到了以下错误:

“DateTime?”不包含“Year”的定义,并且找不到接受“DateTime”类型的第一个参数的可访问扩展方法“Year”


如何在lambda表达式中隐式转换它们?

您必须访问可为空类型的
值字段:

DateTime? nullableDt = DateTime.Now;
int year = nullableDt.Value.Year;

首先检查CALE_DATE是否有值,然后使用.value

_db.CALENDRIERs.Where(c => c.CALE_DATE.HasValue && c.CALE_DATE.Value.Year == year).ToList();

您可以首先检查DateTime对象是否为null,即它是否有值,然后从中获取Year属性


\u db.CALENDRIERs.Where(c=>c.CALE\u DATE.HasValue&&c.CALE\u DATE.Year==Year).ToList()

哇,谢谢,这比我想象的要简单得多,很管用!不客气!正如其他人所建议的那样,在直接访问该值之前,请确保检查该值是否存在。
c.CALE\u DATE.Year
=>
c.CALE\u DATE?.Year
我认为
c.CALE\u DATE.Year
将导致与问题中报告的完全相同的问题。即使已检查为null,它仍然是一个
DateTime?
。如果我理解正确,那么您的意思是,如果DateTime对象为null,那么当我们检查
c.CALE\u DATE.Year==Year
是否正确时,它将抛出异常。但根据上面的代码行,我们首先检查c.CALE_DATE.HasValue,确保对象不为null,即它有一些值,然后我们才检查c.CALE_DATE的YEAR属性是否与
YEAR
值匹配。我想它会起作用的