Ajax OData v2按$expanded entity的属性筛选

Ajax OData v2按$expanded entity的属性筛选,ajax,rest,sharepoint-2010,odata,Ajax,Rest,Sharepoint 2010,Odata,我正在使用$expand增强OData SharePoint REST查询,我想对扩展实体的一个属性执行$filter。但是,我找不到任何关于此正确语法的文档。我发现了一些建议使用实体/属性的地方,但在尝试之后,我失败了: 查询: _vti_bin/listdata.svc/Posts?$expand=Category&$filter=substring(\"Featured Article\",Category/Title) eq false and year(Published) l

我正在使用
$expand
增强OData SharePoint REST查询,我想对扩展实体的一个属性执行
$filter
。但是,我找不到任何关于此正确语法的文档。我发现了一些建议使用实体/属性的地方,但在尝试之后,我失败了:

查询:

_vti_bin/listdata.svc/Posts?$expand=Category&$filter=substring(\"Featured Article\",Category/Title) eq false and year(Published) lt " +year+1+ " and month(Published) lt " +month+1+ " or day(Published) lt " +day+1+ " and ApprovalStatus eq '0'&$select=Title,Published,Category,ApprovalStatus&$orderby=Published desc"
返回:

syntax error '\"' at position 10.

当类别是一个高级别,并且它的Title属性是一个子级别时,如何基于类别实体的标题进行过滤?

问题似乎是斜杠转义双引号,并且您使用的是
子字符串
,而不是
子字符串

如果改为使用单引号,是否有效?或者,您是否希望逐字匹配双引号字符?(如果是这样的话,我想你可以在单引号中保留双引号)

以公共服务为例,请查看以下查询:

http://services.odata.org/Northwind/Northwind.svc/Products?$filter=substringof('Bev', Category/CategoryName) eq true
关于OData查询语法的文档,我建议您查看以下页面:


在“过滤器”部分,有相当多的示例可用于指导。

导航实体上的过滤器独立于扩展

  • 如果导航属性不是集合(1:1关系)

    您可以使用类型/属性进行筛选,下面是一个示例,用于搜索由具有某些id的客户发出的所有订单:

  • 如果导航属性是一个集合(1:N关系)

    • OData版本2:如果展开的实体是实体集合,则无法同时搜索展开的实体和目标实体。例如,您不能执行该查询

      解决方法可能是翻转查询(选择订单而不是客户-每个订单有一个客户): 但是你可以得到重复的客户(你的实际目标实体)

    • < > >强> ODATA版本3 < /强>您可以考虑使用自定义查询选项().< /P> 。
    • ODataVersion4:您可以使用任何构造进行筛选: ?$filter=国家%20eq%20%27德国%27%20和%20订单/任何(o:o/发货城市%20eq%20%27柏林%27)


对不起。。。我应该提到我在SharePoint 2010上。。。它使用ODataV2。我不认为v2和v3之间的内容应该有所不同。如果您查看v2文档,它仍然说使用“substringof”而不是“substring”。我发布的URL有什么错误?很高兴你这么问<代码>“System.Collections.Generic.IEnumerable类型中不存在属性“Title”1[[Microsoft.SharePoint.Linq.DataServiceEntity,Microsoft.SharePoint.Linq,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c]],位于第40位。”
。但是,当我取出针对Category实体的过滤器时,返回的json对象中确实有一个名为
Title`的一级属性。
Category
是指向实体集合还是指向单个实体。我假设它是一个单一的实体,但事实上,你得到的错误把它当作一个IEnumerable,这让我相信它是一个集合。我相信它是。我创建了
Category
字段作为一个查找列表,可以想象查询中的每个项目都可以应用多个类别。然而,我认为使用
$expand
将允许我对该子集合进行筛选。
_vti_bin/listdata.svc/Posts?$expand=Category&$filter=substringof('"Featured Article"',Category/Title) eq false
http://services.odata.org/Northwind/Northwind.svc/Products?$filter=substringof('Bev', Category/CategoryName) eq true