2012-02-07 115 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