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

时间:2013-01-30 10:25:04

标签: linq entity-framework-4 linq-to-entities

实体框架中使用此代码,我收到以下错误。我需要获取特定日期的所有行,DateTimeStart的格式为DataType 2013-01-30 12:00:00.000

代码:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

错误:

base {System.SystemException} = {"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}

任何想法如何解决?

11 个答案:

答案 0 :(得分:237)

DateTime.Date无法转换为SQL。使用EntityFunctions.TruncateTime方法获取日期部分。

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

更新:正如@shankbond在评论中提到的,实体框架6 EntityFunctions已经过时,您应该使用实体框架附带的DbFunctions类。

答案 1 :(得分:69)

您现在应该使用DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();

答案 2 :(得分:13)

我想添加一个解决方案,帮助我解决实体框架中的这个问题:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

我希望它有所帮助。

答案 3 :(得分:13)

EntityFunctions已过时。请考虑改为使用DbFunctions

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

答案 4 :(得分:7)

始终对x.DateTimeStart和currentDate使用EntityFunctions.TruncateTime()。 如:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));

答案 5 :(得分:4)

只需使用简单的属性。

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

如果您的应用无法使用未来日期,那么&gt; = x.DateTimeStart&gt; = currentDateTime.Date 即可。

如果您有更复杂的日期比较,请检查Canonical functions 如果你有EF6 + DB functions

更一般 - 对于搜索问题的人Supported Linq methods in EF 可以用linq语句解释类似的问题,这些语句可以在内存基础列表中使用但不能在EF中使用。

答案 6 :(得分:1)

<强>简体:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();

答案 7 :(得分:1)

使用下面的代码来使用EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

答案 8 :(得分:0)

另一种解决方案可能是:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();

答案 9 :(得分:0)

我对Entity Framework 6.1.3有相同的问题

但情况不同。我的模型属性的类型为可空DateTime

DateTime? CreatedDate { get; set; }

所以我需要查询今天的日期以检查所有记录,所以这对我来说很有效。这意味着我需要截断两条记录才能在DbContext上获得正确的查询:

Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);

答案 10 :(得分:-1)

我也遇到过同样的问题,看来这确实是由 Where 方法中对 .Date 属性的任何调用造成的。删除后,错误消失。考虑在比较运算符的任何一侧调用 .Date 属性会导致此错误。在 Where 方法的外部和之前调用 .Date 属性足以解决此错误。