LINQ to Entities不支持指定的types成员“Date”。 只有初始化器,实体成员和实体导航属性

entity framework中使用此代码我收到以下错误。 我需要获取特定date的所有行, DateTimeStart是这种格式的DataTypetypes2013-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."} 

任何想法如何解决它?

DateTime.Date不能转换为SQL。 使用EntityFunctions.TruncateTime方法获取date部分。

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

更新:作为@shankbond在评论中提到,在entity framework6 EntityFunctions是过时的,你应该使用entity framework附带的DbFunctions类。

您现在应该使用DbFunctions.TruncateTime

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

EntityFunctions已经过时。 考虑使用DbFunctions

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

我想添加一个解决scheme,帮助我在entity framework中解决这个问题:

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

我希望它有帮助。

总是对xDateTimeStart和currentDate使用EntityFunctions.TruncateTime()。 如 :

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

只需使用简单的属性。

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

如果将来的date不适用于您的应用程序,则> = x.DateTimeStart> = currentDateTime.Date就足够了。

如果你有更复杂的date比较,那么检查规范函数 ,如果你有EF6 + DB函数

更一般地说 – 对于search问题的人们EF中的支持的Linq方法可以解释在内存基本列表中工作的linq语句的类似问题,但不能在EF中使用。

使用波纹pipe代码来使用EF6:

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

另一个解决scheme可能是

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

简化:

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