仅使用WHERE条件的日期的年份部分

Den*_*ail 12 linq entity-framework entity-framework-4

在下面的LINQ语句中,我想选择2010年考试日期的人.考试日期存储为日期时间,因为实际日期和时间用于其他应用程序.将exzam日期与"2010"进行比较的最优雅,最简单,最好的方法是什么?或者,我应该使用> =,将考试日期与2010年1月1日进行比较?

var active = dc.People.Where(x => x.exam >= 2010)
        .Select(x => new {x.ContactID, x.FirstName, x.LastName})
                   );

x.MostRecent == DateTime.Parse("1/1/2010").Year
Run Code Online (Sandbox Code Playgroud)

编辑#1

我以为我应该在考试日期看到一个.但是我没有.在这里看到几个帖子之后我回去发现这个作品......

.Where(x => x.exam.Value.Year == 2010)
Run Code Online (Sandbox Code Playgroud)

为什么.Value必须访问.是吗?考试是可以自由的日期时间.

jas*_*son 22

您可以在以下位置使用该Year属性DateTime:

var active = from p in dc.People
             where p.Exam.Year >= 2010
             select new {
                 p.ContactID,
                 p.FirstName,
                 p.LastName
             };
Run Code Online (Sandbox Code Playgroud)

为什么.Value必须访问.是吗?考试是可以自由的日期时间.

正是因为ExamNullable<DateTime>.当您声明一个Nullable<DateTime>类似的实例时

DateTime? exam;
Run Code Online (Sandbox Code Playgroud)

请注意,这exam不是一个DateTime,因此您无法直接访问其属性DateTime.要获得一个具体的实例,DateTime请使用该Value属性Nullable<DateTime>(所有Nullable<T>s都具有此属性)

DateTime instance = exam.Value;
Run Code Online (Sandbox Code Playgroud)

是一种DateTime假设exam不是null.你可以这样说

int year = instance.Year;
Run Code Online (Sandbox Code Playgroud)

当然,为了简洁起见

int year = exam.Value.Year;
Run Code Online (Sandbox Code Playgroud)

请注意,如果exam.HasValue为false ,则抛出此值.