指定的类型成员“日期”在 LINQtoEntity 中不受支持。只有初始值设定项、实体成员和实体导航属性

实体架构中使用这段代码会收到以下错误。我需要得到一个特定日期的所有行,DateTimeStart是这种格式的数据类型 2013-01-30 12:00:00.000

密码:

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

错误:

Base { System.SystemException } = {“指定的类型成员‘ Date’为 在 LINQ 到实体中不支持。只有初始值设定项,实体成员, 支持实体导航属性。”}

有办法解决吗?

121842 次浏览

无法将 DateTime.Date转换为 SQL。请使用 截断时间方法获取日期部分。

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

更新: 正如@shankbond 在评论中提到的那样,在实体框架6中,EntityFunctions已经过时了,您应该使用 DbFunctions类,它是随实体框架一起提供的。

只要使用简单的属性。

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

如果未来的日期不可能在您的应用程序,那么 > = x. DateTimeStart > = currentDateTime. Date是足够的。

如果您有更复杂的日期比较,那么请检查 < a href = “ http://msdn.microsoft.com/en-us/library/bb738626.aspx”rel = “ noReferrer”> Canonical function 如果你有 EF6 + < a href = “ http://msdn.microsoft.com/en-us/library/system.data.entity.dbfunction% 28v = vs. 113% 29.aspx”rel = “ noReferrer”> DB 函数

更一般-对于人们搜索问题 < a href = “ http://msdn.microsoft.com/en-us/library/bb738550”rel = “ noReferrer”> 在 EF 中支持 Linq 方法 可以解释类似的问题与 linq 语句工作在内存基础列表,但不在 EF。

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

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

我想补充一个解决办法,它帮助我在实体框架内解决了这个问题:

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

希望能有所帮助。

现在应该使用 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);

另一个解决方案可能是:

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.TruncateTime(x.Date) == time.Date)).FirstOrDefault();

使用 EF6时,请使用以下代码:

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

我对 Entity Framework 6.1.3也有同样的问题

但是在不同的场景中,我的模型属性的类型是可为空的 DateTime

DateTime? CreatedDate { get; set; }

所以我需要查询今天的日期来检查所有的记录,所以这是什么工程为我。这意味着我需要截断这两条记录,以便在 DbContext上获得正确的查询:

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

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