You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C# Salesforce ForceClient查询中转义&符号?

解决SOQL中含&字符的查询语法错误

嘿,这个问题我碰到过!你遇到的错误根源是把HTML转义后的&直接放到SOQL里了,Salesforce的查询解析器完全不买账这个实体符号,它只认实际的&字符,而且会因为这个奇怪的符号找不到闭合的单引号,所以抛出了那个匹配错误。

具体修复步骤:

  • 替换HTML实体为实际字符:把所有的&替换成&,SOQL允许在字符串字面量里直接使用&,不需要转义成HTML实体。
  • 如果数据来自HTML源,先做解码:如果这些产品名称是从网页表单、HTML接口返回的内容里拿到的,记得先做HTML解码,避免后续再出现类似的转义问题。

修正后的SOQL查询:

SELECT Id, Name, Family FROM Product2 WHERE Name IN ('Connectivity - HMS','Database & Application Services', ....)

C#代码里的正确处理方式:

如果你的产品名称列表是带HTML转义的,比如包含&,可以用WebUtility.HtmlDecode(.NET Core/.NET 5+)或者HttpUtility.HtmlDecode(传统.NET Framework)先解码,再构建查询:

// 假设原始的名称列表带HTML转义
var encodedNames = new List<string> { "Connectivity - HMS", "Database &amp; Application Services" };
// 先解码得到实际名称
var decodedNames = encodedNames.Select(name => WebUtility.HtmlDecode(name)).ToList();
// 构建SOQL的IN子句(注意:实际生产环境建议用绑定变量,避免SOQL注入!)
var namesClause = string.Join(",", decodedNames.Select(n => $"'{n.Replace("'", "\\'")}'"));
var soql = $"SELECT Id, Name, Family FROM Product2 WHERE Name IN ({namesClause})";

// 然后用ForceClient执行查询
var client = new ForceClient(_instanceUrl, _accessToken, _apiVersion);
var results = await client.QueryAsync<Product2>(soql);

重要提醒:直接拼接字符串到SOQL里有注入风险,生产环境最好用绑定变量的方式,比如:

var soql = "SELECT Id, Name, Family FROM Product2 WHERE Name IN (:names)";
var results = await client.QueryAsync<Product2>(soql, new { names = decodedNames });

这样既解决了转义的问题,又保证了查询的安全性。

内容的提问来源于stack exchange,提问作者Haris

火山引擎 最新活动