如何根据内部数组过滤OData?

时间:2012-09-05 14:55:24

标签: asp.net asp.net-web-api odata

所以我使用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”资源,我应该使用一个匹配以下路由url(Get)“/ api / things / {id}”的控制器。

但是,如果我想获取url(Get)“/ api / things”返回的数据子集,该怎么办?我测试了OData协议修改控制器以返回IQueryable,如果我想过滤“Id”或“描述”之类的“Thing”属性,它可以正常工作。不幸的是,当我想根据类别过滤时,我没有解决问题,我相信是因为Categories是一个内部数组。

那么,我该怎么做才能根据类别进行过滤?

1 个答案:

答案 0 :(得分:7)

OData V3支持Any / All操作,您可以通过集合属性进行过滤。例如,要使用以下语法过滤包含Category(1)的内容:

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

如果您使用的是ASP.net Web Api RTM位,则可以使用odata package来支持任何/所有。有关更多示例,您可以查看可查询的示例代码:http://aspnet.codeplex.com/SourceControl/changeset/view/61dfed023e50#Samples%2fNet4%2fCS%2fWebApi%2fODataQueryableSample%2fProgram.cs