繁体   English   中英

OData $过滤了$ expand中的项目

[英]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的答案。

客户可以发出许多订单。

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

  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"/>

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

<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只能在收集后使用。”

顺便说一下, all()any()实际上分别是通用量词 ,∀()和存在量词 ,∃(),你可以从数学课中记住。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM