我正在使用$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.
如果“类别”为高级别,并且“标题”属性是子级别,我将如何基于“类别”实体的标题进行过滤?
答案 0 :(得分:6)
导航实体上的过滤器与展开无关。
如果导航属性不是集合(1:1关系)
您可以使用类型/属性进行过滤,下面是一个示例,用于搜索具有某个ID的客户发出的所有订单: http://services.odata.org/V2/Northwind/Northwind.svc/Orders?$filter=Customer/CustomerID%20eq%20%27ANATR%27
如果导航属性是一个集合(1:N关系):
OData版本2 :当展开的实体是实体集合时,您无法同时搜索展开的实体和目标实体。例如您无法执行该查询 http://services.odata.org/V4/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/ShipCity%20eq%20%27Berlin%27
解决方法可能是翻转查询(选择订单而不是客户 - 每个订单都有1个cutomer): http://services.odata.org/V2/Northwind/Northwind.svc/Orders?$filter=ShipCity%20eq%20%27Berlin%27&$expand=Customer 但是你可以得到重复的客户(你的实际目标实体)。
OData版本3 您可以考虑使用自定义查询选项(http://www.odata.org/documentation/odata-version-3-0/url-conventions/)。
OData版本4 :您可以使用任何构造进行过滤: 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)
答案 1 :(得分: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
在过滤器部分,您可以使用相当多的示例作为指导。