OData v2通过$expanded实体的属性进行过滤

8
我正在使用$expand来增强一个OData SharePoint REST查询,并且我想在扩展实体的属性之一上进行$filter。然而,我找不到任何关于正确语法的文档。我发现有些地方可能建议使用Entity/property,但是尝试后,我失败了:

查询:

_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.

我该如何根据Category实体的Title进行过滤,当Category是高级别时,它的Title属性是子级别?
2个回答

17

导航实体的筛选与展开无关。

  • OData 版本 3:您可以考虑使用自定义查询选项 (http://www.odata.org/documentation/odata-version-3-0/url-conventions/)。

  • OData 版本 4:您可以使用 any 构造来进行筛选: http://services.odata.org/V4/Northwind/Northwind.svc/Customers?$filter=Country%20eq%20%27Germany%27%20and%20Orders/any(o:o/ShipCity%20eq%20%27Berlin%27)


  • 2
    看起来问题在于斜杠转义的双引号,以及你使用的是“substring”而不是“substringof”。
    如果使用单引号,它是否有效?或者你想要字面匹配双引号字符吗?(如果是这种情况,我认为你可以在单引号内不转义地保留双引号)
    _vti_bin/listdata.svc/Posts?$expand=Category&$filter=substringof('Featured Article',Category/Title) eq false
    

    或者

    _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
    

    关于 OData 查询语法的文档,建议查看此页面:http://www.odata.org/documentation/odata-v3-documentation/url-conventions

    在筛选器部分,有很多示例供您参考。


    抱歉...我应该提到我使用的是SharePoint 2010...它使用的是OData v2。 - Brian Vanderbusch
    1
    我不认为v2和v3之间的这些东西应该不同。如果你查看v2文档在这里,它仍然说要使用'substringof'而不是'substring'。你使用我发布的URL时遇到了什么错误? - Jen S
    非常高兴您提问!“在位置40处,类型为'System.Collections.Generic.IEnumerable`1[[Microsoft.SharePoint.Linq.DataServiceEntity, Microsoft.SharePoint.Linq, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]]'的集合中不存在属性'Title'。”然而,当我去掉对Category实体的过滤器时,返回的JSON对象确实有一个名为“Title”的一级属性。 - Brian Vanderbusch
    Category 指向一个实体集合还是单个实体?我一开始认为它指向单个实体,但你收到的错误信息提到它是 IEnumerable,这让我相信它是一个集合。 - Jen S
    我也考虑过那种方法,最终可能会采用它。感谢您的帮助! - Brian Vanderbusch
    显示剩余4条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接