LINQ to Entities不识别方法'System.DateTime ToDateTime(System.String)'方法。

7

我正在尝试将一个应用程序转换为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)' 方法

请帮忙解决,谢谢。


可能是重复的问题,与使用Linq-to-entities转换字符串为日期时间有关的大问题。链接 - MarcinJuraszek
我发现这是一个非常简单的解决方法,而不需要经历很多麻烦。使用SqlFunctions.DateAdd和0间隔 - PriyankaB
4个回答

10

当你这样做时:

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

LINQ to Entities无法将大多数.NET日期方法(包括您使用的强制转换)转换为SQL,因为没有等效的SQL。

您需要执行以下操作:

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

但是等等,上面的查询将获取全部数据,并对其执行.Where操作,肯定不是你想要的。

简单的解决方法可以看这里,个人建议将实体字段和数据库列都设置为DateTime类型。

但是由于你的数据库/实体Date字段是字符串,除了将实体和数据库中的字段更改为DateTime并进行比较之外,你别无选择。


8
不要这样做。这将会把整个表格内容加载到内存中,并使用LINQ to Objects在内存中进行过滤。 - MarcinJuraszek
在这种情况下,您将所有数据发送到客户端,这可能不是期望的行为,特别是如果表包含数百万条记录。 - Andrei Zubov
嘿,他应该遵循什么或不遵循什么并不重要,我正在尝试解释为什么出现错误以及如何让它消失。 - Manish Mishra
2
  1. 你的解释是错误的。根本没有生成任何SQL,也没有发送任何东西到SQL Server。LINQ to Entities无法生成适当的SQL。
  2. 按照你建议的方法消除错误会给OP带来大量其他问题,其中最重要的是巨大的性能问题。
  3. 还有其他解决这个问题的方法,你可以在这里阅读:https://dev59.com/OWsz5IYBdhLWcg3wrJwx
- MarcinJuraszek
感谢Manish Mishra和MarcinJuraszek。Manish Mishra的解决方案解决了错误问题。我从提供的链接中得到了另一个解决方案。修改了我的代码。现在它可以正常工作 :-) 谢谢 - pravprab
显示剩余2条评论

3
你的日期列为什么是字符串?它不应该是 DateTime 吗?
无论如何,如果你尝试在一个实体仓库中使用 .NET 函数进行转换,在 .Where 语句中,你将会遇到该错误。
最好的选择是将该列从字符串更改为 DateTime,并从那里继续进行处理。如果这样做,.Where 语句将会是:
```csharp .Where(entity => entity.Date == desiredDateTimeValue) ```
DateTime dtFrom = Convert.ToDateTime(sFrom );
var something = TransRepository.Entities.Where(x  => x.Date >= dtFrom) ;

感谢您的帮助。但不幸的是,我无法将列更改为DateTime。 - pravprab
4
为什么建议更改数据库是“最佳选择”?有哪些“不是最佳”的选项?大多数开发人员没有控制数据库中数据类型的奢侈,因此建议他更改数据库作为唯一提供的答案是不好的。 - Sailing Judo

3
将转换部分从Linq语句中分离出来,保存在一个变量中,像这样:
将Linq语句中的转换部分提取出来,保存到一个变量中,如下所示:
var xyz = Convert.ToDateTime("12/31/2018");

"最初的回答" 翻译成英文是 "Original Answer"。在 linq 语句中使用这个变量。

这是这里最简单的解决方案。你帮了我很多。谢谢你。 - Harold_Finch

0

/我遇到了一个类似的问题,在查询一个日期时间列时需要获取一个搜索字符串...请看第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;

这篇文章似乎没有提供对问题的答案。请编辑您的回答,或将其作为评论发布到问题中。 - sɐunıɔןɐqɐp

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