我已经提供了一些Web服务来访问信息。
我尝试扩展节点的第一件事。我已经成功完成了以下代码
http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings
现在我想过滤扩展ServiceOfferings时我将获得的ServiceOfferingID。 如何对扩展集合使用过滤器选项
http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings&$filter=ServiceOfferings.ServiceOfferingID eq 127
但它不起作用。什么是正确的方法来做同样的
答案 0 :(得分:38)
您需要编写的查询取决于扩展集合的cardinality。
以下是一些使用公开sample OData Northwind service, provided by odata.org的示例。
订单总是由一位客户完成。
查找具有特定名称的客户订单: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'。这相当于Dhawal的答案。
客户可以发出许多订单。
使用quantifiers 所有或任意来指定您是否希望至少有一个或所有订单服从您的条件。
您可以调用http://services.odata.org/V3/Northwind/Northwind.svc/$metadata并检查NavigationProperty元素,以查看存在哪些关系。
<NavigationProperty Name="Orders"
Relationship="NorthwindModel.FK_Orders_Customers"
ToRole="Orders"
FromRole="Customers"/>
然后,查找与该名称的关联,您将找到基数:
<Association Name="FK_Orders_Customers">
<End
Type="NorthwindModel.Customer"
Role="Customers"
Multiplicity="0..1"/>
<End
Type="NorthwindModel.Order"
Role="Orders"
Multiplicity="*"/>
...
导航这样的一对多关系:http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9,将为您提供:“属性'EmployeeID'的属性访问的父值不是单个值。属性访问可以仅适用于单个值。“
与http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/any(c: c/CompanyName eq 'Vins et alcools Chevalier')之类的全部或任何一种导航多对一关系,将为您提供: “Any / All只能在收集后使用。”
顺便说一句,all()
和any()
实际上分别是Universal quantifier,∀()和existential quantifier,∃(),你可能会记得从数学类。
答案 1 :(得分:8)
oData支持按子对象的属性进行过滤。
这是一个例子: http://services.odata.org/Northwind/Northwind.svc/Orders?$filter=Customer/Country eq 'Germany'
答案 2 :(得分:6)
在OData中,Filter命令仅适用于顶级元素。要使您的过滤器正常工作,您需要具有以下网址
显然,这不是您要编写的查询,但在幕后,您的查询将转换为具有基于顶级元素的根表达式的表达式树。
如果您确实需要过滤数据,则可能会拦截查询并编写您自己的表达式,如下所示:
[QueryInterceptor("CaseStudies")]
public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
{
<Expression here>
}
答案 3 :(得分:1)
可能对某人有帮助
GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')
答案 4 :(得分:0)
您还可以通过服务上的webget完成此操作。我不得不做类似于按属性属性过滤的东西。