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

时间:2015-02-07 10:54:08

标签: c# linq entity-framework lambda

_dbEntities.EmployeeAttendances.Where(x => x.DailyDate.Date.Equals(DateTime.Now.Date)).ToList();
  

“LINQ to中不支持指定的类型成员'Date'   实体。仅初始化程序,实体成员和实体导航   支持属性。“

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

4 个答案:

答案 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)

不要在EF 6中使用EntityFunction .TruncateTime在DbFunctions类中: DbFunctions.TruncateTime(x.DailyDate)

答案 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();