首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >筛选器返回:属性不是单个值

筛选器返回:属性不是单个值
EN

Stack Overflow用户
提问于 2020-08-13 10:16:49
回答 2查看 213关注 0票数 0

我想介绍一下OData筛选器选项的以下问题。

任何关于如何解决这一问题的想法都将受到高度赞赏。

我的目标是解析JSON格式并只返回值

"WorkstationId":"8E5B3291-E092-4091-8C9A-58B7C90E907C“

我已经创建了以下请求,但它生成了以下错误消息: https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations,AccessDomains,DefaultProfiles&$filter=Workstations/WorkstationName eq 'LP08‘

"error":{等分“代码”:"",另一条“消息”:“URI中指定的查询无效。属性'WorkstationName‘的属性访问的父值不是单个值。只能将属性访问应用于单个值。”

错误是由my filter选项:引起的

过滤器=工作站/工作站名称eq‘LP08 08’

我的JSON文件;

代码语言:javascript
复制
  "@odata.context": "https://doesnotexist/MyApi/api/v1.0/$metadata#locations",
  "value": [
    {
      "LocationIdInternal": 1,
      "LocationId": "B9507A00-9057-4CCC-A66B-9AAAB1B6CA5B",
      "DisplayName": "DEFAULT_LOCATION",
      "IsActive": true,
      "Workstations": [
        {
          "WorkstationIdInternal": 1,
          "WorkstationId": "E4FC58FB-7989-4C87-9216-0A3B9F52860E",
          "WorkstationName": "EX08",
          "WorkstationType": "Default"
        },
        {
          "WorkstationIdInternal": 2,
          "WorkstationId": "8E6DB912-F74F-444C-98D6-179747BBDE1A",
          "WorkstationName": "LP08",
          "WorkstationType": "Default"
        },
        {
          "WorkstationIdInternal": 3,
          "WorkstationId": "8E5B3291-E092-4091-8C9A-58B7C90E907C",
          "WorkstationName": "OVER77",
          "WorkstationType": "Default"
        }
      ]
    }
  ]
}
EN

回答 2

Stack Overflow用户

发布于 2020-08-13 13:21:32

只需将筛选器放入$expand中:

https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations($filter= WorkstationName eq 'LP08'),AccessDomains,DefaultProfiles

这只会扩展具有此名称的工作站。

票数 1
EN

Stack Overflow用户

发布于 2020-09-06 13:06:34

扩展@Phyxius提供的解决方案,因为您正在查询Locations控制器,而且每个位置都可以有多个工作站将结果集过滤到只有名为"LP08"的工作站的位置,并且旧的返回与过滤器匹配的工作站,我们需要在两个位置应用过滤器:

  1. 只返回具有与筛选器匹配的工作站的位置,我们需要使用Any操作符:

https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations,AccessDomains,DefaultProfiles&$filter=Workstations/Any(w:w/WorkstationName eq 'LP08')

  1. 现在要限制扩展的Workstations,以便只返回匹配的工作站,我们还必须在扩展中定义$filter。

DefaultProfiles&$filter=Workstations/Any(w:w/WorkstationName eq 'LP08'),AccessDomains,LP08)

这两个过滤器的原因是根级$filter选项重新分配结果的数量,但它不影响这些结果的投影。这与SQL中的WHERE子句引用结果集中没有包含的字段的方式非常相似。

只有$select$expand查询选项会影响结果记录的投影,我们可以在$expand查询选项中使用$expand甚至嵌套的$expand操作符。

我的目标是解析JSON格式并只返回值

"WorkstationId":"8E5B3291-E092-4091-8C9A-58B7C90E907C",

如果您只想返回WorkstationId值,那么删除其他$expand参数并向展开中添加$select可能更简单

代码语言:javascript
复制
https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations($filter=WorkstationName eq 'LP08';$select=WorkstationName)&$filter=Workstations/Any(w:w/WorkstationName eq 'LP08')

但是,这仍然将返回嵌套数组中的结果,即使其中只有一个值。

代码语言:javascript
复制
{
  "@odata.context": "https://doesnotexist/MyApi/api/v1.0/$metadata#locations",
  "value": [
    {
      "LocationIdInternal": 1,
      "LocationId": "B9507A00-9057-4CCC-A66B-9AAAB1B6CA5B",
      "DisplayName": "DEFAULT_LOCATION",
      "IsActive": true,
      "Workstations": [
        {
          "WorkstationId": "8E6DB912-F74F-444C-98D6-179747BBDE1A"
        }
      ]
    }
  ]
}

如果您只想返回Workstation结果而不将它包装在某个位置,那么您应该能够查询Workstations控制器,而不是Locations控制器:

这只适用于您的模型支持此导航,但记住“根”项类型必须始终是控制器或函数指定的类型是有帮助的。

代码语言:javascript
复制
https://doesnotexist/MyApi/api/v1.0/workstations?$expand=Locations&$filter=WorkstationName eq 'LP08'&$select=WorkstationId
代码语言:javascript
复制
{
  "@odata.context": "https://doesnotexist/MyApi/api/v1.0/$metadata#workstations",
  "value": [
    {
      "WorkstationId": "8E6DB912-F74F-444C-98D6-179747BBDE1A",
      "Locations": [
        {
          "LocationIdInternal": 1,
          "LocationId": "B9507A00-9057-4CCC-A66B-9AAAB1B6CA5B",
          "DisplayName": "DEFAULT_LOCATION",
          "IsActive": true
        }
      ]
    }
  ]
}

如果不需要位置信息,则完全省略展开子句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63392962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档