5

そこで、mvc4 Web API を使用して、url (Get) “/api/things” が次のデータを返すコントローラーを作成しました。

 <ArrayOfThing>
   <Thing>
   <Id>1</Id>
   <Description>The Thing Desc</Description>
   <Categories>
           <Category><Id>1</Id></Category>
          <Category><Id>2</Id></Category>
   </Categories>
  </Thing>
  <Thing>
   <Id>2</Id>
   <Description>The Other Thing Desc</Description>
   <Categories>
           <Category><Id>1</Id></Category>
           <Category><Id>3</Id></Category>
   </Categories>
  </Thing>
</ArrayOfThing>

*物とカテゴリには多対多の関係があることに注意してください

「Thing」リソースが 1 つ必要な場合は、次のルート URL (Get) 「/api/things/{id}」に一致するコントローラーを使用する必要があることはわかっています。

しかし、URL (Get) "/api/things" によって返されるデータのサブセットを取得したい場合はどうでしょう。IQueryable を返すようにコントローラーを変更する OData プロトコルをテストしたところ、Id や Description などの「Thing」のプロパティで $filter したい場合に問題なく動作しました。残念ながら、Category に基づいてフィルターをかけたいときにうまくいきませんでした。これは、Categories が内部配列であるためだと思います。

では、カテゴリに基づいてフィルタリングするにはどうすればよいでしょうか?

4

1 に答える 1

11

OData V3 は Any/All 操作をサポートしており、コレクション プロパティでフィルター処理できます。たとえば、Category(1) を含むものをフィルタリングするには、次の構文を使用します。

/api/things/?$filter=Categories/any(category: category/Id eq 1)

ASP.net Web Api RTM ビットを使用している場合は、odata パッケージを使用して任意/すべてをサポートできます。その他の例については、クエリ可能なサンプル コードを確認できます。

于 2012-09-06T06:11:43.650 に答える