【问题标题】:'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supportedLINQ to Entities 不支持“日期”。仅支持初始化器、实体成员和实体导航属性
【发布时间】:2011-10-28 08:55:50
【问题描述】:

我正在尝试执行以下代码并收到错误消息

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
     var context = new LoggingEntities();
     var query = from t in context.Logs

           where t.Title == title 
           && t.Timestamp == LogDate

           select t;
     return query.ToList();
}

我收到的错误是“LINQ to Entities 不支持指定的类型成员 'Date'。仅支持初始化程序、实体成员和实体导航属性。”我尝试了各种将所有内容转换为字符串的尝试,仅比较日期部分,但似乎无法获得正确的组合。非常感谢任何帮助。

【问题讨论】:

  • 向我们展示 Logs 类和它被映射到的表。
  • 我将 EFv1 与 .net 3.5 一起使用。日志类只是企业库中的一个日志表,标题为字符串类型,时间戳为日期时间字段。我只想比较日期部分

标签: c# entity-framework linq linq-to-entities


【解决方案1】:

不是最好的解决方案,但它确实有效。由于种种原因,此时我必须使用 .net 3.5 并且修改数据库会很困难。无论如何,这是一个可行的解决方案:

            var query = from t in context.Logs
                      where t.Title == title 
                      && t.Timestamp.Day == LogDate.Day
                      && t.Timestamp.Month == LogDate.Month
                      && t.Timestamp.Year == LogDate.Year
                      select t;

不是最优雅的解决方案,但很有效。

【讨论】:

  • 在 LINQ to Entities 中不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
【解决方案2】:

如果我错了,请纠正我,但在 mikemurf22 的示例中,它需要检查日期组件的每个部分,并且可能需要更多的服务器处理?

无论如何,我偶然发现了这个问题,这就是我的解决方案。

假设您将只传递日期组件,您可以找到您传递的当天的最后一分钟,并使用 where 子句定义范围。

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59)

    var query = from t in context.Logs
                where t.Timestamp >= date
                where t.Timestamp <= enddate
                select t;

    return query.ToList();
}

【讨论】:

    【解决方案3】:

    你可以使用这个技巧:

    DateTime startDate = LogDate.Date;
    DateTime endDate = LogDate.Date.AddDays(1);
    
    var query = from t in context.Logs
                where t.Title == title 
                      && t.Timestamp >= startDate 
                      && t.Timestamp < endDate
                select t;
    

    【讨论】:

    • 我更正了一点。当然,您不能在查询中使用 AddDays 方法。但是你可以把它移到外面。所以解决方法仍然有效。
    【解决方案4】:

    如果你使用的是 EF 6.0+,你可以使用DbFunctions.TruncateTime(DateTime?)

    var query =
        from t in context.Logs
        where t.Title == title 
        && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
        select t;
    

    注意:对于 DbFunctions 不可用的早期版本的 EF,可以使用 EntityFunctions.TruncateTime(DateTime?) 代替。

    【讨论】:

    • 您还必须截断您的 LogDate.Date 属性
    • @invalidusername LogDate 是一个 DateTime,这意味着 LogDate.Date 被“截断”
    • +1 先生。在我的情况下,我无法使用接受的答案,因为我进行了“大于”比较,您无法分别比较日、月和年。
    • 不知道这些功能。太棒了。
    • BTW -- 该功能现已过时,已移至另一个程序集。请改用“DbFunctions.TruncateTime(t.Timestamp)”。
    【解决方案5】:

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

    var query = from t in context.Logs
                  where t.Title == title 
                  && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
                  select t;
    

    【讨论】:

      【解决方案6】:

      将LongDate转换为.ToShortDateString然后就可以这样使用了:

      EntityFunctions.TruncateTime(t.Timestamp) == LogDate
      

      像麦克一样

      【讨论】:

        【解决方案7】:

        试试这个:

        var calDate = DateTime.Now.Date.AddDays(-90);
        
        var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
        

        【讨论】:

          【解决方案8】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-08-15
            • 2023-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-17
            相关资源
            最近更新 更多