在尝试解析列以进行不等式比较时,LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法

Sey*_*avi 22 c# entity-framework

我的页面中有以下代码:

var myVar= Entity.SetName
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);
Run Code Online (Sandbox Code Playgroud)

start和end是int,但p.ID是string.所以我应该将p.ID转换为int.但我得到以下错误:

LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法,并且此方法无法转换为存储表达式.

问题出在哪儿??

mip*_*e34 15

首先,我强烈建议检查您的数据库设计,是否有一个非常好的理由ID成为一个string.我会考虑将ID数据库类型更改为int,您将通过转换摆脱这个问题.

您获得的错误意味着EF不知道如何将方法转换Int32.Parse()为SQL.基本上你有两个选择如何处理:

在linq之外进行实体比较:

var myVar= Entity.SetName.AsEnumerable()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);
Run Code Online (Sandbox Code Playgroud)

不建议这样做,因为在应用where条件之前,您正在从DB读取整个结果集.

或者在SO上的这篇文章中描述自定义模型定义函数:

在EF 4.0实体框架中将字符串转换为Int :我在哪里扩展CSDL/MSL?


小智 5

将解析函数移出linq表达式.

int id = int.Parse(p.ID);
var myVar= Entity.SetName
.Where(p => id >= start && int.Parse(p.ID) <= end);
Run Code Online (Sandbox Code Playgroud)

  • 这怎么可能有效呢?"p"是仅存在于linq语句的上下文中的范围变量.这将导致"p在当前上下文中不存在".你的前提是正确的,但你的例子不是.它比这更复杂. (3认同)