"LINQ不支持指定的类型成员'Date'"

Mik*_*ike 4 c# linq lambda entity-framework

_dbEntities.EmployeeAttendances.Where(x => x.DailyDate.Date.Equals(DateTime.Now.Date)).ToList();
Run Code Online (Sandbox Code Playgroud)

"LINQ to Entities不支持指定的类型成员'Date'.仅支持初始值设定项,实体成员和实体导航属性."

如何根据linq查询中的当前日期获取员工数据?

Far*_*yev 16

EntityFramework无法转换DateTime.Date为SQL.因此,它无法生成预期的SQL.如果您只想获得部分,则可以使用EntityFunctions.TruncateTime()DbFunctions.TruncateTime()(基于EF版本)方法代替Date:

 _dbEntities.EmployeeAttendances
            .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date)
            .ToList();
Run Code Online (Sandbox Code Playgroud)

附加信息:

EntityFunctions方法称为规范函数.这些是一组功能,所有实体框架提供程序都支持这些功能.这些规范函数将转换为提供程序的相应数据源功能.规范函数是访问核心语言之外的功能的首选方法,因为它们使查询可移植.

你可以找到所有经典功能在这里和所有的日期和时间规范函数在这里.

更新:

截至EF6 EntityFunctions已被弃用System.Data.Entity.DbFunctions.

  • 从.NET 4.6.2开始(可能更早,我没有检查)EntityFunctions已经为System.Data.Entity.DbFunctions折旧了 (3认同)

小智 9

不要在EF 6中使用EntityFunction .TruncateTime在DbFunctions类中:

DbFunctions.TruncateTime(x.DailyDate)
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

如果该DailyDate属性已经只是一个日期而不是日期和时间,那么最简单的方法是使用:

// Outside the query so it becomes a constant, effectively
var today = DateTime.Today;
var employees = _dbEntities.EmployeeAttendances
                           .Where(x => x.DailyDate == today)
                           .ToList();
Run Code Online (Sandbox Code Playgroud)

如果确实有时间(使上述失败),您可以随时使用:

// Outside the query so it becomes a constant, effectively
var today = DateTime.Today;
var tomorrow = today.AddDays(1);
var employees = _dbEntities.EmployeeAttendances
                           .Where(x => x.DailyDate >= today &&
                                       x.DailyDate < tomorrow)
                           .ToList();
Run Code Online (Sandbox Code Playgroud)

......或者TruncateTime像Farhad的回答所说的那样使用.我仍然建议DateTime.Today先评估:

var today = DateTime.Today;
var employees = _dbEntities.EmployeeAttendances
                       .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == today)
                       .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意Today(例如DateTime.Now)使用系统默认时区.你应该仔细考虑这是否是你想要的.