OData $过滤了$ expand中的项目

时间:2012-02-07 05:12:56

标签: wcf filter filtering odata 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 

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

5 个答案:

答案 0 :(得分:38)

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

以下是一些使用公开sample OData Northwind service, provided by odata.org的示例。

订单总是由一位客户完成。

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

客户可以发出许多订单。

使用quantifiers 所有任意来指定您是否希望至少有一个或所有订单服从您的条件。

  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')
  3. 您可以调用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')之类的全部或任何一种导航多对一关系,将为您提供: “Any / All只能在收集后使用。”

    顺便说一句,all()any()实际上分别是Universal quantifier,∀()和existential quantifier,∃(),你可能会记得从数学类。

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

可能对某人有帮助

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

答案 4 :(得分:0)

您还可以通过服务上的webget完成此操作。我不得不做类似于按属性属性过滤的东西。