我有一个错误:
LINQ to Entities 无法识别方法“Int32 ToInt32(System.String)”方法,并且该方法无法转换为存储表达式。
这段代码:
plist= plist.Where(p => Convert.ToInt(p.Period) >= syslockPeriod);
p.期间示例:201206
pList 是IQueryable。p.Period 是字符串类型的。sysLockPeriod 是整数。
如何解决?
我有一个错误:
LINQ to Entities 无法识别方法“Int32 ToInt32(System.String)”方法,并且该方法无法转换为存储表达式。
这段代码:
plist= plist.Where(p => Convert.ToInt(p.Period) >= syslockPeriod);
p.期间示例:201206
pList 是IQueryable。p.Period 是字符串类型的。sysLockPeriod 是整数。
如何解决?
LINQ to entity 将尝试转换Convert.ToInt32()
为 SQL 指令,因为它不是它可以转换的已知方法之一,然后它会生成该错误。
您有一些解决方法,但对于所有这些,您必须更改您的代码。让我们看看你能做什么(按优先顺序,对我来说)。
Period
属性/字段转换为正确的类型。如果它是整数类型,那么为什么将它作为字符串存储在数据库中?IQueryable
为IList
with ToList()
before Where()
,现在该where
子句将在本地执行,而不是在数据库上执行(如果列表很大,这可能会很糟糕)。不要将其转换syslockPeriod
为 LINQ 查询之外的字符串。这将有助于消除错误(如果您还删除了“Convert.ToInt”),但会返回错误的结果。这将给出一个“真实”的结果:"12" < "2"
.
正确的解决方案是将字符串列“Period”转换为整数列。
这是 LINQ 中的常见问题,因为您不能在 LINQ 表达式中使用普通函数。(这允许 LINQ 进行惰性求值并减少调用函数时可能发生的与状态相关的问题)。幸运的是,我们可以通过创建一个业务对象在访问器中为您进行转换来解决这个问题,或者使用 Linq to SQL 来转换它。
我更喜欢前者,因为创建业务对象是一种很好的做法,因为它鼓励重用。
有关示例,请参阅http://mosesofegypt.net/post/LINQ-to-Entities-Workarounds-on-what-is-not-supported.aspx上的优秀帖子。