【问题标题】:How do I filter with OData based on an inner array?如何根据内部数组使用 OData 进行过滤?
【发布时间】:2012-08-30 08:07:32
【问题描述】:

所以我使用 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>

*注意事物和类别有多对多的关系

我知道如果需要一个“事物”资源,我应该使用与以下路由 url (Get)“/api/things/{id}”匹配的控制器。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    /api/things/?$filter=Categories/any(category: 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

    【讨论】:

    • 救命稻草!但是,contains 不适用于包含 xml 的字符串。就我而言,我正在尝试检查字符串 "&lt;key&gt;id&lt;/key&gt;&lt;value&gt;1&lt;/value&gt;" 中的“id”。它给了我内部服务器错误。知道是什么原因造成的
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2022-08-08
    相关资源
    最近更新 更多