我有这样的代码:
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而没有反之亦然。此致
答案 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.ConfiguracionesBalance
是IQueryable
。
IQueryables与IEnumerables的不同之处在于,IQueryable不会保存代码来为您的序列创建枚举器。它包含Expression
和Provider
。 Provider
知道谁应该执行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转换为字符串?