【问题标题】:The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation propertiesLINQ to Entities 不支持指定的类型成员“日期”。只有初始化器、实体成员和实体导航属性
【发布时间】:2023-03-13 18:32:01
【问题描述】:

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 中不受支持。只有初始化器,实体成员, 和实体导航属性受支持。"}

有什么解决办法吗?

【问题讨论】:

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

标签: linq entity-framework-4 linq-to-entities


【解决方案1】:

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

【讨论】:

  • 删除后,错误消失 -- 是的,但他们需要这个.Date调用,或者替代方法,而不是在@之外987654322@。他们已经知道它会引发异常。它“似乎”不是由.Date 引起的,它由它引起的。
【解决方案2】:

Entity Framework 6.1.3 也有同样的问题

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

DateTime? CreatedDate { get; set; }

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

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

【讨论】:

    【解决方案3】:

    简体:

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

    【讨论】:

      【解决方案4】:

      您现在应该使用DbFunctions.TruncateTime

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

      【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        更新:正如 @shankbond 在 cmets 中提到的,在实体框架 6 中 EntityFunctions 已过时,您应该使用实体框架附带的 DbFunctions 类。

        【讨论】:

        • 我必须稍微修改你的版本。Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);让我知道你的恶棍
        • 我希望你不介意我已经编辑你的答案添加 .date 如果你同意,所以仅供参考:-) 谢谢你的支持,我真的很感激
        • @GibboK 当然,没问题 :) 这只是为了格式化长字符串。
        • EntityFunctions 已过时,改为使用 DbFunctions.TruncateTime 方法
        • LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
        【解决方案7】:

        另一种解决方案可能是:

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

        【讨论】:

          【解决方案8】:

          只需使用简单的属性。

          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 functions 如果你有 EF6+ DB functions

          更一般地 - 对于搜索问题的人Supported Linq methods in EF 可以解释适用于内存基础列表但不适用于 EF 的 linq 语句的类似问题。

          【讨论】:

            【解决方案9】:

            EntityFunctions 已过时。考虑改用DbFunctions

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

            【讨论】:

              【解决方案10】:

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

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

              希望对你有帮助。

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-08-15
                  • 2011-10-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-11
                  • 2020-05-30
                  相关资源
                  最近更新 更多