OData $过滤了$ expand中的项目

Nul*_*ter 26 wcf expand filtering filter odata

我已经提供了一些Web服务来访问信息.

我试图扩展节点的第一件事.我用以下代码成功完成了这项工作

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings
Run Code Online (Sandbox Code Playgroud)

现在我想过滤扩展ServiceOfferings时我将获得的ServiceOfferingID.如何对扩展集合使用过滤器选项

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings&$filter=ServiceOfferings.ServiceOfferingID eq 127 
Run Code Online (Sandbox Code Playgroud)

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

R. *_*urs 42

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

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

订单总是由一个客户完成.

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

客户可以发出许多订单.

使用全部任何量词 来指定您是否希望至少一个或所有订单服从您的条件.

  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 = ORrders&$ 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"/>
Run Code Online (Sandbox Code Playgroud)

然后,查找与该名称的关联,您将找到基数:

<Association Name="FK_Orders_Customers">
    <End 
         Type="NorthwindModel.Customer" 
         Role="Customers" 
         Multiplicity="0..1"/>
    <End 
         Type="NorthwindModel.Order" 
         Role="Orders" 
         Multiplicity="*"/>
    ...
Run Code Online (Sandbox Code Playgroud)

导航这样的一对多关系: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只能在收集后使用."

顺便说一句,all()any()实际上是全称量词,∀()和存在量词,∃(),分别为,您可以从数学课记住.


Dha*_*wal 10

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

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


小智 7

可能对某人有帮助

GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')
Run Code Online (Sandbox Code Playgroud)


SCB*_*SCB 6

在OData中,Filter命令仅适用于顶级元素.要使您的过滤器正常工作,您需要具有以下URL

http://www.domain.com/ODataService/WorkService.svc/CaseStudies(x)/ServiceOfferings?format=json&$filter=ServiceOfferingID eq 127

显然,这不是您要编写的查询,而是在幕后将查询转换为表达式树,该表达式树具有基于顶级元素的根表达式.

如果您确实需要过滤数据,则可能会拦截查询并编写自己的表达式,如下所示:

[QueryInterceptor("CaseStudies")]
public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
{
    <Expression here>
}
Run Code Online (Sandbox Code Playgroud)