2012-02-07 116 views
20

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

我尝试展开节点的第一件事。和我有下面的代码

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings 

现在我想筛选ServiceOfferingID扩大ServiceOfferings时,我会得到做到了成功。 如何使用过滤器选项反对扩大收集

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

但它不工作。什么是正确的做法相同

+0

简短回答:将点改为斜线,即'&$ filter = ServiceOfferings/ServiceOfferingID eq 127'应该可以工作。 – BrainSlugs83 2016-09-20 21:29:59

回答

6

在OData过滤器命令只适用于顶层元素。为了您的过滤工作,你需要具备以下网址

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

@nil如果你阅读他们实际上正在讨论的关于展开的过滤问题,这是我的回答者所处理的问题,这与在复杂类型上进行过滤有所不同,所以尽管您可能会说这不是真的,但它对于扩展 – SCB 2013-06-18 22:40:12

-1

您也可以通过在服务webget做到这一点。我不得不做类似的过滤属性的属性。

35

你需要编写查询依赖于扩大收集的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所有任何到指定是要至少一个或所有订单的服从你的条件。 http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o/EmployeeID eq 9)

  • 查找都没有很长一段时间排序任何客户: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/OrderDate lt DateTime'1997-01-01')
  • 您可以

    1. 找到客户的其中一个或多个订单已经通过特定员工处理请致电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()实际上是Universal quantifier,∀()和existential quantifier,∃(),分别为,您可以从数学课记住。

    +0

    有很大的帮助... 谢谢 – danbord 2017-03-17 18:49:04