LINQ to Entities Exception中不支持指定的types成员“Date”

我在执行以下声明时遇到exception。

DateTime result; if (!DateTime.TryParse(rule.data, out result)) return jobdescriptions; if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753 return jobdescriptions; return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date ); 

例外

 The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

我知道例外的意思,但我不知道如何摆脱它。 任何帮助?

由于没有等效的SQL,因此LINQ to Entities无法将大多数.NET Date方法(包括您使用的转换)转换为SQL。

解决方法是在LINQ语句之外使用Date方法,然后传递一个值。 它看起来好像Convert.ToDateTime(rule.data).Date导致错误。

date时间属性上的调用date也不能转换为SQL,所以一个解决方法是比较可以转换为LINQ的.Year .Month和.Day属性,因为它们只是整数。

 var ruleDate = Convert.ToDateTime(rule.data).Date; return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year && j.Deadline.Month == ruleDate.Month && j.Deadline.Day == ruleDate.Day); 

您可以使用EntityFunctionsTruncateTime方法将Date属性正确转换为SQL:

 using System.Data.Objects; // you need this namespace for EntityFunctions // ... DateTime ruleData = Convert.ToDateTime(rule.data).Date; return jobdescriptions .Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData); 

更新: EntityFunctionsEntityFunctions被弃用,使用DbFunctions.TruncateTime

对于EF6,请改为使用DbFunctions.TruncateTime(mydate)。

ef6中的“EntityFunctions.TruncateTime”或“DbFunctions.TruncateTime”正在运行,但在大数据中有一些性能问题。

我认为最好的办法就是这样做:

 DateTime ruleDate = Convert.ToDateTime(rule.data); DateTime startDate = SearchDate.Date; DateTime endDate = SearchDate.Date.AddDay(1); return jobdescriptions.Where(j.Deadline >= startDate && j.Deadline < endDate ); 

它比使用date的部分更好。 因为查询在大数据中运行得更快。

尝试使用

 return jobdescriptions.AsEnumerable() .Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date ); 

AsEnumerable()将查询的上下文从LINQ切换到实体,将LINQ切换到对象,因此条件不会转换为SQL

这意味着LINQ to SQL不知道如何将Date属性转换为SQLexpression式。 这是因为DateTime结构的Date属性在SQL中没有模拟。

它为我工作。

 DateTime dt = DateTime.Now.Date; var ord = db.Orders.Where (p => p.UserID == User && p.ValidityExpiry <= dt); 

来源: Asp.net论坛

我有同样的问题,但我使用DateTime的范围。 我的解决办法是操纵开始时间(任何date)00:00:00和结束时间23:59:59所以我不能再把我的date时间转换为date,而是保持date时间。

如果你只有一个date时间,你也可以将开始时间(任何date)设置为00:00:00,结束时间设置为23:59:59然后你就像是时间跨度一样进行search。

 var from = this.setStartTime(yourDateTime); var to = this.setEndTime(yourDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to); 

你也可以用DateTime-Range来做到这一点:

 var from = this.setStartTime(yourStartDateTime); var to = this.setEndTime(yourEndDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);