【问题标题】:LINQ to Entities does not recognize the method 'System.DateTime ToDateTime(System.String)' methodLINQ to Entities 无法识别方法“System.DateTime ToDateTime(System.String)”方法
【发布时间】:2013-12-27 08:07:09
【问题描述】:

我正在尝试将一个应用程序转换为 EntityFrameWork codefirst。 我现在的代码是

 string sFrom  ="26/12/2013";
 select * FROM Trans where  CONVERT(datetime, Date, 105) >=   CONVERT(datetime,'" + sFrom + "',105) 

我试过了

 DateTime dtFrom = Convert.ToDateTime(sFrom );
TransRepository.Entities.Where(x  =>Convert.ToDateTime(x.Date) >= dtFrom) 

但我遇到了这样的错误

LINQ to Entities 无法识别方法“System.DateTime” ToDateTime(System.String)' 方法

请帮忙 提前致谢

【问题讨论】:

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


【解决方案1】:

当你这样做时:

TransRepository.Entities.Where(x  =>Convert.ToDateTime(x.Date) >= dtFrom) 

LINQ to Entities 无法将大多数 .NET Date 方法(包括您使用的转换)转换为 SQL,因为没有等效的 SQL。 您需要做的是以下操作:

 DateTime dtFrom = Convert.ToDateTime(sFrom );
  TransRepository
 .Entities.ToList()//forces execution
 .Where(x  =>Convert.ToDateTime(x.Date) >= dtFrom) 

但是等待上面的查询将获取整个数据,并对其执行.Where,你肯定不希望这样,

简单的灵魂是this, 就个人而言,我会将我的实体字段设为DateTime,将数据库列设为DateTime

但是由于您的 db/Entity Date 字段是字符串,您没有其他选择,除了将实体和 db 中的字段更改为 DateTime 然后进行比较

【讨论】:

  • 不,不要那样做。它将整个表格内容带入内存并使用 LINQ to Objects 在内存中执行过滤。
  • 在这种情况下,您将所有数据都发送给客户端,这可能不是您想要的行为,尤其是当表包含数百万条记录时。
  • @ManishMishra 你的答案还没有完成?不要发布它。但即使有更新,我也不同意,我认为 OP 不应该听从你的建议。
  • 嘿,他应该遵循或不遵循并不重要,我试图解释,为什么错误存在以及如何看到它消失
  • 1.你的解释是错误的。根本没有生成任何 SQL,也没有任何东西发送到 SQL Server。 LINQ to Entities 根本无法生成正确的 SQL。 2. 以您建议的方式消除错误会给 OP 带来大量其他问题,其中最重要的是巨大的性能问题。 3. 还有其他解决这个问题的方法,你可以在这里阅读它们:stackoverflow.com/questions/7740693/…
【解决方案2】:

为什么你的日期列是一个字符串?不应该是DateTime吗?

无论如何,如果您尝试在 .Where 语句中针对实体存储库使用 .NET 函数执行转换,您将收到该错误。

您最好的选择是将该列从字符串更改为 DateTime 并从那里继续。如果这样做,.Where 语句将是:

DateTime dtFrom = Convert.ToDateTime(sFrom );
var something = TransRepository.Entities.Where(x  => x.Date >= dtFrom) ;

【讨论】:

  • 感谢您的帮助。但不幸的是,我无法将列更改为 DateTime
  • 为什么建议更改数据库是“最佳选择”?什么是“非最佳”选项?大多数开发人员没有控制数据库中数据类型的奢侈,因此建议他更改它,因为唯一提供的答案很糟糕。
【解决方案3】:

从 linq 语句中取出转换部分并将其保存在变量中,如下所示:

var xyz = Convert.ToDateTime("12/31/2018");

并在 linq 语句中使用此变量。

【讨论】:

  • 这是这里最简单的解决方案。你帮了我很多。谢谢你。
【解决方案4】:

/我遇到了类似的问题,我正在获取搜索字符串并查询日期时间列...见第 4 行/

1)case "Admission_Date":
2)if (!String.IsNullOrEmpty(SearchValue))
3)   {
4)   DateTime dtFrom = 
Convert.ToDateTime(SearchValue); 
wards = from s in db.CORE_DATA_tbl
    where s.Admit_Date == dtFrom
    orderby s.ActionType, s.AdmissionLocation
    select s;
    }
    break;

【讨论】:

  • (这篇文章似乎没有为问题提供answer。请编辑您的答案,或者将其作为对问题的评论发布)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2013-04-07
相关资源
最近更新 更多