LINQ to Entities不支持'Date'。仅支持初始化器、实体成员和实体导航属性。

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();
}

我收到的错误信息是"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported." 我试过将所有内容转换为字符串,只比较日期部分,但似乎无法找到正确的组合方式。非常感谢您的帮助。

1
请展示Logs类及其映射的表格。 - BennyM
我正在使用带有.NET 3.5的EFv1。 日志类只是一个企业库中的日志表,标题为String类型,时间戳为datetime字段。我只想比较日期部分。 - mikemurf22
8个回答

90

你还需要截断(LogDate.Date)属性。 - invalidusername
1
@invalidusername LogDate是一个DateTime类型,这意味着LogDate.Date被“截断”。 - Henrik Stenbæk
3
谢谢你先生,我无法使用被接受的答案,因为我进行了“大于”比较,在这种情况下,您不能单独比较日期、月份和年份。 - HTBR
2
不知道这些函数,太棒了。 - Lotok
19
顺便提一下 - 那个函数现在已经过时并已被移动到另一个程序集中。请改用“DbFunctions.TruncateTime(t.Timestamp)”代替。 - Bob
确保将日期放入变量中。我进行了比较,如“DbFunctions.TruncateTime(t.Timestamp)== DateTime.Now.Date”,但这不起作用。“var today = DateTime.Now.Date; DbFunctions.TruncateTime(t.Timestamp)== today”可以工作! - kloarubeek

25

这不是最好的解决方案,但它可行。由于各种原因,我目前必须使用 .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;

虽然不是最优雅的解决方案,但它确实有效。


1
指定的类型成员“Date”在LINQ to Entities中不受支持。仅支持初始化程序、实体成员和实体导航属性。 - SAR


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;

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();
}

0

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

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

像迈克一样做


0

试试这个:

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

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

-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;

我稍微修改了一下。当然你不能在查询内部使用AddDays方法,但是你可以将它移到外面。所以解决方法仍然有效。 - algreat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接