LINQ to Entities不支持“date”。 仅支持初始化器,实体成员和实体导航属性
我正试图执行下面的代码,并收到错误
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(); }
我收到的错误是“指定的types成员”Date“在LINQ to Entities中不受支持,只支持初始值设定项,实体成员和实体导航属性。 我已经尝试过把每一个字母都转换成一个string,只是比较date部分,但似乎无法得到正确的结合。 任何帮助是极大的赞赏。
如果您使用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?)
。
不是最好的解决scheme,但它的工作原理。 由于各种原因,我必须在这时使用.net 3.5,修改数据库将是困难的。 无论如何,这是一个解决scheme:
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;
不是最优雅的解决scheme,但它是有效的。
EF6已经过时了EntityFunctions.TruncateTime(t.Timestamp) 。
在下面使用
DbFunctions.TruncateTime(t.Timestamp)
总是为xDateTimeStart和LogDate使用EntityFunctions.TruncateTime()。 如 :
var query = from t in context.Logs where t.Title == title && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate) select t;
纠正我,如果我错了,但在mikemurf22的例子中,它将需要检查date组件的每个部分,并可能更多的服务器处理?
无论如何,我偶然发现这个问题,这是我的解决scheme。
假设您将只传入date组件,您可以find您传入的一天中的最后一分钟,然后使用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(); }
你可以使用这个黑客:
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;
将LongDate转换为.ToShortDateString
,然后你可以这样使用它:
EntityFunctions.TruncateTime(t.Timestamp) == LogDate
像迈克一样
尝试这个:
var calDate = DateTime.Now.Date.AddDays(-90); var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)