[英]OData $filter with items in a $expand
我已经提供了一些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
但它不起作用。 做同样的事情的正确方法是什么
您需要编写的查询取决于扩展集合的基数 。
以下是一些使用odata.org提供的公共样本OData Northwind服务的示例 。
订单总是由一个客户完成。
查找具有特定名称的客户订单: http : //services.odata.org/V3/Northwind/Northwind.svc/Orders?$ expand = Customer &$ filter = Customer / CompanyName eq'Vins et alcools Chevalier' 。 这相当于Dhawal的答案。
客户可以发出许多订单。
使用全部或任何 量词来指定您是否希望至少一个或所有订单服从您的条件。
您可以调用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 ,将为您提供: “The属性“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只能在收集后使用。”
oData支持按子对象的属性进行过滤。
这是一个例子: http : //services.odata.org/Northwind/Northwind.svc/Orders?$filter = Customer / Country eq'Gerden'
在OData中,Filter命令仅适用于顶级元素。 要使您的过滤器正常工作,您需要具有以下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完成此操作。 我不得不做类似于按属性属性过滤的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.