LINQ to Entities 不支持指定的类型成员“日期”。仅初始值设定项、实体成员和实体导航属性

问题描述 投票:0回答:12

Entity Framework 中使用此代码时收到以下错误。我需要获取特定日期的所有行,

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} = {"指定的类型成员'Date'是 LINQ to Entities 不支持。仅初始值设定项、实体成员、 并支持实体导航属性。"}

有什么解决办法吗?

linq entity-framework-4 linq-to-entities
12个回答
325
投票

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

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

更新:正如 @shankbond 在评论中提到的,在实体框架 6 中

EntityFunctions
已过时,您应该使用
DbFunctions
类,该类随实体框架一起提供。


106
投票

您现在应该使用

DbFunctions.TruncateTime

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

23
投票

EntityFunctions
已过时。考虑使用
DbFunctions
代替。

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

19
投票

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

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

希望对您有帮助。


8
投票

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

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

7
投票

只需使用简单的属性。

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 就足够了。

如果您有更复杂的日期比较,请检查规范函数 如果您有 EF6+ 数据库功能

更一般 - 对于搜索问题的人EF 中支持的 Linq 方法 可以解释适用于内存基础列表但不适用于 EF 的 linq 语句的类似问题。


5
投票

简化版:

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

2
投票

使用以下代码来使用 EF6:

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

1
投票

我也有同样的问题

Entity Framework 6.1.3

但场景不同。我的模型属性的类型为 null

DateTime

DateTime? CreatedDate { get; set; }

所以我需要查询今天的日期来检查所有记录,所以这对我有用。这意味着我需要截断两条记录才能在

DbContext
:

上获得正确的查询
Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);

0
投票

另一种解决方案可能是:

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

0
投票

// 验证您的实际使用情况 bool hasEntryRecord = db.Asistencia.Any(a => a.empleadosid == horareq.empleadosid && a.horaentrada.HasValue && a.horaentrada.Value.Date == TodayDate); 我发现错误 System.NotSupportedException:“LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始值设定项、实体成员和实体导航属性。'


-2
投票

我也遇到过同样的问题,看来这确实是由于在

.Date
方法中调用
Where
属性引起的。删除后,错误就会消失。请考虑在比较运算符的任何一侧调用
.Date
属性都会导致此错误。在
.Date
方法之外和之前调用
Where
属性足以解决此错误。

© www.soinside.com 2019 - 2024. All rights reserved.