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


138

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

码:

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

错误:

base {System.SystemException} = {“ LINQ to Entities不支持指定的类型成员'Date'。仅支持初始化程序,实体成员和实体导航属性。”}

任何想法如何解决?


我可以在EF Core 2.1.1中使用x.DateTimeStart.Date
Kirsten Greed

Answers:


271

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

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

更新:正如@shankbond在评论中提到的那样,Entity Framework 6 EntityFunctions已过时,您应该使用DbFunctionsEntity Framework附带的类。


1
我必须略微修改您的版本。其中(x => EntityFunctions.TruncateTime(x.DateTimeStart)== currentDate.Date); 让我知道您的想法
GibboK 2013年

1
希望您不要介意,如果您同意,我将编辑您的答案添加.date,所以仅供参考:-)非常感谢您的支持
GibboK 2013年

1
@GibboK当然,没问题:)那只是为了格式化长字符串。
Sergey Berezovskiy 2013年

68
EntityFunctions已经过时了,而是使用DbFunctions.TruncateTime方法
shankbond

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

83

您现在应该使用 DbFunctions.TruncateTime

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


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

17

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

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

希望对您有所帮助。


15

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

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

8

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

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

5

只需使用简单的属性。

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

如果您有比较复杂的日期比较,则请检查Canonical函数, 以及是否具有EF6 + DB函数

更广泛地讲-对于寻找问题的人们EF中支持的Linq方法 可以使用在内存基础列表上有效但在EF中不可用的linq语句来解释类似的问题。


3

简化:

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


0

另一个解决方案可能是:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.