如何转义要在OData查询中使用的单引号?

我正在使用OData来查询我的数据库。 当“adapterName”只包含文本时,以下代码行正常工作。

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 

如果“adapterName”包含单引号则失败。 我尝试使用以下代码转义单引号:

 adapterName = adapterName.replace(/\'/g, '\\\''); 

虽然这正确地逃避了用户定义的文本,但该函数仍然失败。 谁能告诉我查询中文本的正确格式是什么?

实际上%27不是解决方案。 正确的转义方法是将两个单引号放入字符串而不是一个。 例如"o''clock"

我想稍微扩展一下这个问题,以便它也适用于调用oData服务操作动作。 答案的答案是正确的,但是有一个特定的顺序,其中服务操作的参数必须编码。

oData服务操作接收基本类型参​​数,其中字符串被包含在’使得有效的URL(预编码)将如此

AddString?值= ‘时许’

这将导致服务器看到

AddStringα值= ‘O’

‘时钟’

将产生“错误请求 – 查询语法错误”。

要更正此问题,您必须在插入url之前双重转义’和UrlEncode。

不要UrlEncodeurl本身。

这是一个可行的例子。

 // value passed as "o'clock" public async Task AddString(string value) { // Escape ' with '' and UrlEncode value value = HttpUtility.UrlEncode(value.Replace("'", "''")); string url = String.Format("AddString?value='{0}'", value); // No need to UrlEncode url here as dynamic content has already been escaped // Execute ..... } [WebGet] public void AddString(string value) { // here value will be "o'clock" } 

当使用机智substringof时,它需要通过4而不是1撇号进行转义:

a'b -> $filter=(substringof('a''''b', FirstName))

而不是使用$ filter = Title eq’text’

我正在使用oData startswith()函数。

$ filter = startswith(标题,键)

然后我尽可能多地传递密钥。

var pos = key.indexOf("'");
if(pos > -1) {
key = key.substring(0, pos);
}