无法将字符串转换为int32 LINQ

时间:2017-11-23 16:53:54

标签: c# 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   解析(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而没有反之亦然。此致

5 个答案:

答案 0 :(得分:2)

您需要为解析后的字符串的结果分配一个新变量(整数类型),并将积分变量应用于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,而原始RHS类型tmpBSCID当然是字符串。

顺便说一下,考虑使用StringBuilder来构建tmpBSCID而不是循环和连接字符串。

最后,您可能还会考虑无法将tmpBSCID解析为整数的情况。您可以使用int.TryParse(out var myIntegerBSCID)作为替代方法 - 如果解析失败,则返回false。

答案 1 :(得分:2)

你的变量是什么类型" 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();

答案 2 :(得分:1)

从您的代码(+=)我得出结论:您要尝试做的是:从数据表中收集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

答案 3 :(得分:0)

Althoug LINQ无法识别int.Parse()你可以bsc = _c.ConfiguracionesBalance.Where(x => x.mdEstatusRegistro && x.sEstatus.Equals("A") && x.ID == (int)(tmpBSCID)).ToList();强制转换。

答案 4 :(得分:0)

查看您的第一个错误,我认为_c.ConfiguracionesBalanceIQueryable

IQueryables与IEnumerables的不同之处在于,IQueryable不会保存代码来为您的序列创建枚举器。它包含ExpressionProviderProvider知道谁应该执行Expression(通常是像数据库这样的外部进程)。提供者也知道这个外部进程所说的语言(例如SQL)。提供商知道如何将Expression翻译成这种语言。

只要您想访问IQueryable表示的序列的第一个元素,就会从IQueryable中获取此序列的IEnumerator。表达式将发送给提供者,提供者将其转换为其他进程的语言,并命令其他进程执行查询。

此提供程序无法将您自己的函数转换为SQL。实际上,虽然有很多可以翻译的.NET函数,但有一个list of supported and not supported LINQ functions

在此列表中,您可以看到不支持Int32.Parse。因此,在本地解析是明智的。

你没有写出tmpBSCID的类型,但是从你的陈述中我得知它是一个字符串。如果你写了这个类型,你已经为自己回答了问题:

string tmpBSCID += row["ModuloURL"].ToString(); // from your code
tmpBSCID = Int32.Parse(tmpBSCID);

你想知道为什么编译器抱怨它不能将int转换为字符串?