繁体   English   中英

无法将字符串转换为int32 LINQ

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM