Linq to Entity比较Where子句中的两个字符串

时间:2012-07-09 07:19:08

标签: c# linq linq-to-entities

我有一个错误:

  

LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,并且此方法无法转换为商店表达式。

这段代码:

plist= plist.Where(p => Convert.ToInt(p.Period) >= syslockPeriod);

p.Period示例:201206

pList IQueryable 。 p.Period是字符串类型。 sysLockPeriod是int。

如何解决?

3 个答案:

答案 0 :(得分:0)

LINQ to实体将尝试将Convert.ToInt32()转换为SQL指令,因为它不是可以转换的已知方法之一,然后它会生成该错误。

您有一些解决方法但是对于所有这些解决方法,您必须更改代码。让我们看看你能做什么(按照偏好顺序,对我来说)。

  • Period属性/字段转换为正确的类型。如果它是整数类型,那么为什么将它作为字符串存储在数据库中?
  • 创建一个函数(在您的数据库中)以执行转换并使用计算的属性(或视图)。 LINQ to Entities现在将具有正确类型的 true 列(无需转换)或要调用的函数(在SQL端)以进行转换。请参阅MSDN上关于how to call custom database functions
  • 的此示例
  • IQueryable之前使用IListToList()转换为Where(),现在where子句将在本地执行,而不是在数据库上执行(这可能是某些内容)如果列表非常大,可怕的事情。)

答案 1 :(得分:0)

不要将syslockPeriod转换为LINQ查询之外的字符串。它将有助于摆脱错误(如果你也删除“Convert.ToInt”),但会返回错误的结果。这会产生“真实”的结果:"12" < "2"

正确的解决方案是将该字符串列“Period”转换为整数列。

答案 2 :(得分:0)

这是LINQ中的常见问题,因为您无法在LINQ表达式中使用常规函数。 (这允许LINQ进行延迟评估并减少调用函数时可能出现的状态相关问题)。幸运的是,我们可以通过创建一个业务对象来为访问者中的转换来解决这个问题,或者使用Linq to SQL来转换它。

我更喜欢前者,因为在鼓励重用时创建业务对象是一种好习惯。

请参阅http://mosesofegypt.net/post/LINQ-to-Entities-Workarounds-on-what-is-not-supported.aspx的优秀帖子了解样本。