我已经实现了一个 WCD 数据服务/OData 服务器,将实体设置为开放类型。我正在使用自定义 IMetadataProvider、IQueryProvider 等。我可以创建我的实体、设置打开的属性、检索它们、更新和搜索——主要是。当我尝试搜索名称中带有“破折号”之类的属性时,问题就来了
这有效:
GET /Service/Cases?$filter=ABC eq 'ABC'
这不起作用:
GET /Service/Cases?$filter=A-BC eq 'ABC'
这也不起作用:
GET /Service/Cases?$filter=A%2DBC eq 'ABC'
我收到以下错误:
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code />
<message xml:lang="en-US">Syntax error at position 7.</message>
</error>
(正如我所说,我可以获得一个名称中带有破折号的开放属性的实体。并更新它等)
我猜想解析 URL 的任何东西都将破折号解释为减法表达式,这是有道理的。除了如果我正确阅读 OData 规范,实体的属性名称由 entitySimpleProperty 定义(规范中没有定义,但我认为是 entityProperty 的拼写错误)...定义为 *pchar,如RFC 3986 第 3.3 节。反过来,评估为...
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
其中 ALPHA 是 %41-%5A 和 %61-%7A,DIGIT 是 %30-%39,连字符是 %2D,句点是 %2E,下划线是 %5F,波浪号是 %7E。
这表明破折号是一个合法的字符,绕了一圈。不是我需要它。那么,规范的哪一部分规定了允许的字符是什么?
谢谢你的帮助!