![](/img/trans.png)
[英]LINQ to Entities does not recognize the method 'Int32 Int32(System.String)' method, and this method cannot be translated into a store expression
[英]Cannot convert string to int32 LINQ
我有这样的代码:
foreach (DataRow row in tmpDatosModulos.Rows)
{
tmpBSCID += row["ModuloURL"].ToString();
tmpBSCID = tmpBSCID.Replace("../BSC/wf_BSC_Reporte.aspx?BSCID=", "");
}
bsc = _c.ConfiguracionesBalance.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == int.Parse(tmpBSCID)).ToList();
调试时出现错误:
LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法,并且该方法无法转换为商店表达式。
我阅读了有关此问题的另一个问题,解释的解决方案是解析LINQ表达式之外的内容,因此我将执行以下操作:
foreach (DataRow row in tmpDatosModulos.Rows)
{
tmpBSCID += row["ModuloURL"].ToString();
tmpBSCID = tmpBSCID.Replace("../BSC/wf_BSC_Reporte.aspx?BSCID=", "");
}
tmpBSCID = int.Parse(tmpBSCID);
bsc = _c.ConfiguracionesBalance.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == tmpBSCID).ToList();
但我明白了
无法将int隐式转换为字符串
在此行中tmpBSCID = int.Parse(tmpBSCID);
这有点令人困惑,因为我正在将字符串转换为int,反之亦然。 问候
您需要为解析的字符串的结果分配一个新的变量(整数类型),并将整型变量应用于LINQ查询,即:
var myIntegerBSCID = int.Parse(tmpBSCID);
bsc = _c.ConfiguracionesBalance
.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == myIntegerBSCID)
.ToList();
除了dynamic
,C#不允许您更改现有变量的类型,即
tmpBSCID = int.Parse(tmpBSCID);
这是行不通的,因为LHS类型需要为Integral,而tmpBSCID
的原始RHS类型当然是字符串。
顺便说一句,考虑使用StringBuilder
建立tmpBSCID,而不是循环和串联字符串。
最后,您可能还会考虑无法将tmpBSCID
解析为整数的情况。 您可以使用int.TryParse(out var myIntegerBSCID)
作为替代-如果解析失败,则返回false。
变量“ tmpBSCID”是哪种类型? 从您发布的代码来看,它似乎是一个字符串 ,并且在一部分中
tmpBSCID = int.Parse(tmpBSCID);
您正在将int字段分配给字符串变量。 如果需要继续使用tmpBSCID,则在解析方法后使用“ ToString()”,否则可以创建一个新的int变量(或var)。 我将其重写为
var tmpBSCIDValue = int.Parse(tmpBSCID);
bsc = _c.ConfiguracionesBalance.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == tmpBSCIDValue).ToList();
从你的代码( +=
)我断定你正在试图做的是:从数据表中收集ID值的列表 ,而不是一个单一的ID。 因此,您必须构建此列表,然后在LINQ查询中使用Contains
:
var idValues = tmpDatosModulos.Rows.Select(row =>
{
tmpBSCID = row["ModuloURL"].ToString()
.Replace("../BSC/wf_BSC_Reporte.aspx?BSCID=", "");
return int.Parse(tmpBSCID);
}).ToList();
bsc = _c.ConfiguracionesBalance
.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A")
&& idValues.Contains(x.ID)).ToList();
旁注:您似乎对int.Parse
总是成功充满信心。 我更喜欢使用int.TryParse
。
Althoug LINQ无法识别int.Parse()
您可以执行bsc = _c.ConfiguracionesBalance.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == (int)(tmpBSCID)).ToList();
强制转换。
查看您的第一个错误,我认为_c.ConfiguracionesBalance
是一个IQueryable
。
IQueryable与IEnumerables有所不同,因为IQueryable不保存为您的序列创建Enumerator的代码。 它包含一个Expression
和一个Provider
。 Provider
知道谁应该执行Expression
(通常是外部过程,如数据库)。 提供者还知道该外部过程使用的语言(例如SQL)。 提供者知道如何将Expression
翻译成这种语言。
一旦您要访问由IQueryable表示的序列的第一个元素,就将从IQueryable中获取此序列的IEnumerator。 将该表达式发送给提供程序,该提供程序将其翻译为其他过程的语言,并命令该其他过程执行查询。
该提供程序无法将您自己的函数转换为SQL。 实际上,尽管有很多可以转换的.NET函数,但还是列出了支持的和不支持的LINQ函数
在此列表中,您可以看到不支持Int32.Parse。 因此,在本地进行解析是明智的。
您没有写tmpBSCID
的类型,但是从您的陈述中我得知它是一个字符串。 如果您输入了类型,则您已经为自己回答了问题:
string tmpBSCID += row["ModuloURL"].ToString(); // from your code
tmpBSCID = Int32.Parse(tmpBSCID);
并且您想知道为什么编译器会抱怨无法将int转换为字符串吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.