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

C# 如何转义要在OData查询中使用的单个引号?,c#,odata,C#,Odata,我正在使用OData查询我的数据库。当“adapterName”仅包含文本时,以下代码行可以正常工作 ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 如果“adapterName”包含单个引号,则会失败。我尝试使用以下代码转义单引号: adapterName = adapterName.replace(/\'/g

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

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, '');
如果“adapterName”包含单个引号,则会失败。我尝试使用以下代码转义单引号:

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

虽然这可以正确地转义用户定义的文本,但函数仍然失败。有人能告诉我查询中文本的正确格式吗?

实际上%27不是一个解决方案。正确的转义方法是在字符串中插入两个单引号,而不是一个单引号。
在示例
“o”clock

中,当使用wit子字符串时,需要使用4而不是1撇号来转义:


a'b->
$filter=(子字符串('a''b',FirstName))

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

我正在使用odatastartswith()函数

$filter=startswith(标题、键)

然后我尽可能多地传递钥匙

var pos=key.indexOf(“')
if(pos>-1){

key=key.substring(0,pos);



我想对答案进行一点扩展,以便它也适用于调用oData服务操作操作。发布的答案是正确的,但服务操作的参数必须按照特定的顺序进行编码

oData服务操作接收原语类型参数,其中字符串包含在一个“字符串”中,因此有效的url(预编码)将是这样的

AddString?value='o''clock'

这将导致服务器看到

AddString?value='o'

“时钟”

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

要更正此问题,必须在插入url之前对“”进行双转义并对其进行url编码

不要对url本身进行url编码

下面是一个可行的例子

// 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"
}

oData文档中实际描述了这一点:

例如,这些规则之一是字符串文本中的单引号表示为两个连续的单引号

示例3:有效的ODataURL:

(“奥尼尔”)

(“智能手机%2f平板电脑”)

示例4:无效的OData URL:

(‘奥尼尔’)

('O%27Neil')

(“智能手机/平板电脑”)

第一个和第二个示例无效,因为string>literal中的一个单引号必须表示为两个连续的单引号。第三个示例无效,因为正斜杠被解释为路径段分隔符和类别(“Smartphone不是有效的OData路径段,Tablet也不是”)


修正:)我需要将单引号转换为双引号。注意:如果使用子字符串筛选器,并且查询已经包含在引号中,则需要使用4'而不是2.+1进行转义。将“替换为”或%27似乎不适用于odata查询。这应该是可以接受的答案。我完全同意,%27给出了400个错误的请求,因为请求路径中的字符无效。只是好奇:用反斜杠转义也可以接受吗?示例:“o'clock”我很困惑,为什么这似乎在我不知道的相关地方没有记录。为了寻找解决办法,我发疯了好几次。这是对答案的评论,而不是对答案的评论