156

在实体框架中使用此代码我收到以下错误。我需要获取特定日期的所有行,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} = {“LINQ to Entities 不支持指定的类型成员 'Date'。仅支持初始化程序、实体成员和实体导航属性。”}

任何想法如何解决它?

4

11 回答 11

301

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

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

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

于 2013-01-30T10:29:53.540 回答
92

You should now use DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
于 2014-03-12T21:50:02.053 回答
21

EntityFunctions已过时。考虑DbFunctions改用。

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
于 2014-04-20T06:06:13.697 回答
19

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

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

我希望它有所帮助。

于 2014-02-26T09:58:21.610 回答
8

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

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
于 2013-06-13T17:32:34.080 回答
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+ DB 函数

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

于 2013-01-30T10:46:47.293 回答
5

简化:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
于 2016-12-01T08:00:24.740 回答
2

使用下面的代码来使用 EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
于 2017-05-15T15:40:05.543 回答
1

我有同样的问题Entity Framework 6.1.3

但是有不同的场景。我的模型属性是可为空的DateTime

DateTime? CreatedDate { get; set; }

所以我需要查询今天的日期以检查所有记录,所以这对我有用。这意味着我需要截断两条记录以获得正确的查询DbContext

Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);
于 2020-08-25T04:01:29.750 回答
0

另一种解决方案可能是:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
于 2015-01-16T08:16:12.453 回答
-2

我也遇到过同样的问题,似乎它确实是由 Where 方法中对 .Date 属性的任何调用引起的。删除后,错误消失。考虑在比较运算符的任何一侧调用 .Date 属性会导致此错误。在 Where 方法之外和之前调用 .Date 属性足以解决此错误。

于 2021-07-13T08:38:22.443 回答