Wcf 开放式实体上属性的法定字符

Wcf 开放式实体上属性的法定字符,wcf,wcf-data-services,odata,Wcf,Wcf Data Services,Odata,我已经实现了一个WCD数据服务/OData服务器,其中一个实体被设置为开放类型。我正在使用定制的IMetadataProvider、IQueryProvider等。我可以创建我的实体、设置打开的属性、检索它们、更新和搜索——大部分是这样。当我试图搜索名称中带有“破折号”的属性时,就会出现问题 这项工作: GET /Service/Cases?$filter=ABC eq 'ABC' 这不起作用: GET /Service/Cases?$filter=A-BC eq 'ABC' GET /Se

我已经实现了一个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'
这也不起作用:

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>
其中,ALPHA为%41-%5A和%61-%7A,数字为%30-%39,连字符为%2D,句点为%2E,下划线为%5F,波浪号为%7E

这表明破折号是一种法律性质,它是一个完整的圆圈。我不需要这样。那么,规范的哪一部分规定了允许的字符是什么


谢谢你的帮助

根据CSDL(EDM)规则,属性必须有效。允许任何有效标识符,例如由这段XSD定义的标识符:

  <xs:simpleType name="TSimpleIdentifier">
    <xs:restriction base="xs:string">
      <xs:maxLength value="480" />
      <!-- The below pattern represents the allowed identifiers in ECMA specification -->
      <xs:pattern value="[\p{L}\p{Nl}][\p{L}\p{Nl}\p{Nd}\p{Mn}\p{Mc}\p{Pc}\p{Cf}]{0,}" />
    </xs:restriction>
  </xs:simpleType>

它基本上是任何有效的编程语言标识符。不幸的是,OData规范在这方面可能有点混乱(甚至可能是错误的)


请注意,WCF DS在大多数情况下不会对此进行验证,因为验证检查的费用太高。它依靠IDataServiceMetadataProvider实现来做正确的事情。这就是为什么你看到它在某些情况下起作用,而在某些情况下则不起作用。

非常感谢你,维泰克!非常感谢你的帮助。