“LINQ不支持指定的类型成员’Date’”
_dbEntities.EmployeeAttendances.Where(x => x.DailyDate.Date.Equals(DateTime.Now.Date)).ToList();
“LINQ to Entities不支持指定的类型成员’Date’。仅支持初始值设定项,实体成员和实体导航属性。”
如何根据linq查询中的当前日期获取员工数据?
EntityFramework
无法将DateTime.Date
转换为SQL。 因此,它无法生成预期的SQL。 如果您只想获取Date
部分,则可以使用EntityFunctions.TruncateTime()
或DbFunctions.TruncateTime()
(基于EF
版本)方法,而不是这样:
_dbEntities.EmployeeAttendances .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date) .ToList();
附加信息:
EntityFunctions
方法称为规范函数 。 这些是一组function,所有entity framework提供程序都支持这些function。 这些规范函数将转换为提供程序的相应数据源function。 规范函数是访问核心语言之外的function的首选方法,因为它们使查询可移植。
您可以在此处找到所有规范函数以及所有日期和时间规范函数。
更新:
自EntityFunctions
起, EntityFunctions
已被弃用于System.Data.Entity.DbFunctions
。
不要在EF 6中使用EntityFunction .TruncateTime在DbFunctions类中:
DbFunctions.TruncateTime(x.DailyDate)
如果DailyDate
属性已经只是一个日期而不是日期和时间,那么最简单的方法是使用:
// Outside the query so it becomes a constant, effectively var today = DateTime.Today; var employees = _dbEntities.EmployeeAttendances .Where(x => x.DailyDate == today) .ToList();
如果确实有时间(使上述失败),您可以随时使用:
// 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();
...或者使用TruncateTime
作为Farhad的回答建议。 我仍然建议首先评估DateTime.Today
:
var today = DateTime.Today; var employees = _dbEntities.EmployeeAttendances .Where(x => EntityFunctions.TruncateTime(x.DailyDate) == today) .ToList();
请注意, Today
(如DateTime.Now
)使用系统默认时区。 你应该仔细考虑这是否是你想要的。
以防它有助于某人……在EF 6中,EntityFunctions已经过时,请改用DbFunctions类。 您可能希望包含命名空间System.Data.Entity;
例如:
_dbEntities.EmployeeAttendances.Where(x => DbFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date).ToList();