2012-02-07 9 views
20

情報にアクセスするための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 

しかし、その動作していないに対してフィルタオプションを使用することができます。

+0

短い答え:ドットをスラッシュに変更してください。つまり、 '&$ filter = ServiceOfferings/ServiceOfferingID eq 127'が機能します。 – BrainSlugs83

答えて

6

ODataでは、フィルタコマンドは最上位レベルの要素でのみ機能します。あなたのフィルタが機能するためには、あなたは明らかに、これはあなたが書くしようとしているクエリではありませんが、背後でクエリが持つ式ツリーに変換されている

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

次のURLを持っている必要がありますトップレベル要素に基づくルート式。

あなたが本当に潜在的にクエリを傍受あなたができたデータをフィルタリングし、以下のように独自の式を記述するために必要な場合:

[QueryInterceptor("CaseStudies")] 
     public Expression<Func<CaseStudie, bool>> CaseStudieFilter() 
     { 
      <Expression here> 
     } 
+0

@nilあなたが実際に私の回答者が扱っているものである拡張のフィルタリングについて実際に話している質問を読むなら、これは複雑なタイプのフィルタリングとは異なるので、これは展開ではないと言うかもしれませんが – SCB

-1

あなたはまた、サービスのWEBGETを通じてこれを実現することができます。私はプロパティのプロパティによってフィルタリングするのと同様のことをしなければならなかった。

35

あなたが書く必要がありますクエリは、拡張コレクションのcardinalityによって異なります。ここでは

は一例です。

公開番号sample OData Northwind service, provided by odata.orgを使用するいくつかの例を示します。

注文は常に1人の顧客によって行われます。

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/all(o: o/OrderDate lt DateTime'1997-01-01')

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/$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="*"/> 
        ... 
    

    このような1対多の関係ナビゲート:http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9を、あなたを与える:を "プロパティ 'EmployeeID'のプロパティアクセスの親値は単一の値ではなく、プロパティアクセスは単一の値にしか適用できません。

    すべて、またはいずれかに多対1の関係をナビゲート、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

    関連する問題