_dbEntities.EmployeeAttendances.Where(x => x.DailyDate.Date.Equals(DateTime.Now.Date)).ToList();
“LINQ to中不支持指定的类型成员'Date' 实体。仅初始化程序,实体成员和实体导航 支持属性。“
如何根据linq查询中的当前日期获取员工数据?
答案 0 :(得分:15)
EntityFramework
无法将DateTime.Date
转换为SQL。因此,它无法生成预期的SQL。如果您只想获得EntityFunctions.TruncateTime()
部分,则可以使用DbFunctions.TruncateTime()
或EF
(基于Date
版本)方法代替,
_dbEntities.EmployeeAttendances
.Where(x => EntityFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date)
.ToList();
其他信息:
EntityFunctions
方法称为 规范函数 。这些是一组功能,所有实体框架提供程序都支持这些功能。这些规范函数将转换为提供程序的相应数据源功能。规范函数是访问核心语言之外的功能的首选方法,因为它们可以使查询保持可移植性。
您可以找到所有规范函数here以及所有日期和时间规范函数here。
<强> 更新 强>
自EF6起EntityFunctions
已弃用System.Data.Entity.DbFunctions
。
答案 1 :(得分:9)
答案 2 :(得分: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();
如果 有时间(使上述失败),您可以随时使用:
// 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
)使用系统默认时区。你应该仔细考虑这是否是你想要的。
答案 3 :(得分:2)
以防它帮助某人......
在EF 6中,EntityFunctions已过时,请改用DbFunctions类。
您可能希望包含命名空间System.Data.Entity;
例如:
_dbEntities.EmployeeAttendances.Where(x => DbFunctions.TruncateTime(x.DailyDate) == DateTime.Now.Date).ToList();