OData $filter,其中包含 $expand 中的项目

问题描述 投票:0回答:6

我提供了一些网络服务来访问信息。

我要做的第一件事就是尝试扩展一个节点。我已经使用以下代码成功完成了该操作

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 

但它不起作用。做同样的事情的正确方法是什么

wcf filter filtering odata expand
6个回答
58
投票

您需要编写的查询取决于扩展集合的基数

以下是一些使用公共 示例 OData Northwind 服务的示例,由 odata.org 提供

订单始终由一位客户完成。

查找具有特定名称的客户所下的订单: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'。这相当于Dhawal的答案。

一个客户可以发出多个订单。

使用量词allany来指定您是否希望至少一个或所有订单遵守您的条件。

  1. 查找已由特定员工处理一个或多个订单的客户: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o/EmployeeID eq 9)
  2. 查找很久没有下单的顾客: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/OrderDate lt DateTime'1997-01-01')

您可以调用 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()
实际上分别是通用量词,∀()和存在量词,∃(),您可能在数学课上还记得。


14
投票

oData 支持按子对象的属性进行过滤。

这是一个例子: http://services.odata.org/Northwind/Northwind.svc/Orders?$filter=Customer/Country eq '德国'


7
投票

可能对某人有帮助

GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')

6
投票

在 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>
}

0
投票

您还可以通过服务上的 webget 来完成此操作。我不得不做一些类似于按属性的属性进行过滤的事情。


0
投票

我们也可以做多重过滤和多重扩展吗?

© www.soinside.com 2019 - 2024. All rights reserved.