指定的类型成员'Date'在 LINQ to Entities 中不受支持。仅初始值设定项、实体成员和实体导航属性



实体框架中使用此代码时,我收到以下错误。我需要获取特定日期的所有行,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 to Entities 中不受支持。仅初始值设定项、实体成员、 并支持实体导航属性。

有什么想法可以解决吗?

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

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

更新:如注释中所述@shankbond,在实体框架 6 中,EntityFunctions已过时,您应该使用实体框架附带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);
我想

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

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

我希望它有所帮助。

始终将 EntityFunctions.TruncateTime() 用于 x.DateTimeStart 和 currentDate。如:

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);

如果应用中无法显示将来的日期,则>= x.DateTimeStart>= 当前日期时间.Date 就足够了。

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

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

简体:

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);

另一种解决方案可能是:

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

我遇到了同样的问题,似乎它实际上是由于在Where方法中存在对.Date属性的调用引起的。删除后,错误将消失。请注意,在比较运算符的任何一端调用 .Date 属性都会导致此错误。在 Where 方法外部和之前调用 .Date 属性足以解决此错误。

最新更新