LINQ to Entities不支持“日期”。仅支持初始值设定项,实体成员和实体导航属性

时间:2011-08-16 19:29:53

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

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

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'。仅支持初始值设定项,实体成员和实体导航属性。”我已尝试过将各种符号转换为字符串的各种尝试,只比较日期部分,但似乎无法获得正确的组合。非常感谢任何帮助。

8 个答案:

答案 0 :(得分:86)

如果您使用的是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?)代替。

答案 1 :(得分:24)

不是最好的解决方案,但它确实有效。由于各种原因,我此时必须使用.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;

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

答案 2 :(得分:3)

答案 3 :(得分:2)

始终对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;

答案 4 :(得分:1)

如果我错了,请纠正我,但在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();
}

答案 5 :(得分:0)

将LongDate转换为.ToShortDateString,然后您可以这样使用它:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate
像迈克一样

答案 6 :(得分:0)

试试这个:

var calDate = DateTime.Now.Date.AddDays(-90);

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)

答案 7 :(得分:-1)

你可以使用这个黑客:

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;