我提供了一些网络服务来访问信息。
我要做的第一件事就是尝试扩展一个节点。我已经使用以下代码成功完成了该操作
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
但它不起作用。做同样的事情的正确方法是什么
您需要编写的查询取决于扩展集合的基数。
以下是一些使用公共 示例 OData Northwind 服务的示例,由 odata.org 提供。
订单始终由一位客户完成。
查找具有特定名称的客户所下的订单: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'。这相当于Dhawal的答案。
一个客户可以发出多个订单。
使用量词、all或any来指定您是否希望至少一个或所有订单遵守您的条件。
您可以调用 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'),将为您提供: “任何/全部只能在集合后使用。”
顺便说一句,
all()
和any()
实际上分别是通用量词,∀()和存在量词,∃(),您可能在数学课上还记得。
oData 支持按子对象的属性进行过滤。
这是一个例子: http://services.odata.org/Northwind/Northwind.svc/Orders?$filter=Customer/Country eq '德国'
可能对某人有帮助
GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')
在 OData 中,“过滤器”命令仅适用于顶级元素。为了让你的过滤器正常工作,你需要有以下 URL
http://www.example.com/ODataService/WorkService.svc/CaseStudies(x)/ServiceOfferings?format=json&$filter=ServiceOfferingID eq 127
显然这不是您要编写的查询,但在幕后您的查询正在转换为表达式树,该表达式树具有基于顶级元素的根表达式。
如果您确实需要过滤数据,您可能会拦截查询并编写自己的表达式,如下所示:
[QueryInterceptor("CaseStudies")]
public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
{
<Expression here>
}
您还可以通过服务上的 webget 来完成此操作。我不得不做一些类似于按属性的属性进行过滤的事情。
我们也可以做多重过滤和多重扩展吗?