过滤器返回:属性不是单个值

问题描述

我想提出OData过滤器选项存在的以下问题。

任何有关解决此问题的想法都将受到高度赞赏。

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

“ WorkstationId”:“ 8E5B3291-E092-4091-8C9A-58B7C90E907C”,

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

错误”:{ “ code”:“”, “ message”:“在URI中指定的查询无效。属性'WorkstationName'的属性访问的父值不是单个值。属性访问只能应用于单个值。 >

错误是由我的过滤器选项引起的:

filter = Workstations / WorkstationName eq'LP08'

我的JSON文件

  "@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",{
          "WorkstationIdInternal": 3,"WorkstationId": "8E5B3291-E092-4091-8C9A-58B7C90E907C","WorkstationName": "OVER77","WorkstationType": "Default"
        }
      ]
    }
  ]
}

解决方法

只需将过滤器放入$ expand中即可

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

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

, @phyxius提供的解决方案上的

扩展,因为您正在查询Locations控制器,并且每个位置可以具有许多工作站来将结果集过滤为具有旧的名为"LP08"的工作站的位置会返回那些也与过滤器匹配的工作站,我们需要在两个地方应用该过滤器:>

  1. 要仅返回工作站与过滤器匹配的位置,我们需要使用Any运算符:

    https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations,AccessDomains,DefaultProfiles&$filter=Workstations/Any(w:w/WorkstationName eq 'LP08')
    
  2. 现在要限制扩展的Workstations以便只返回匹配的工作站,我们还必须在扩展内部定义$ filter。

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

使用这两个过滤器的原因是,根级别$filter选项限制了结果的数量,但不会影响这些结果的 projection 。这与SQL中的WHERE子句可以引用根本不包含在结果集中的字段的方式几乎相同。

只有$select$expand查询选项会影响结果记录的 projection ,我们可以使用$select; $filter; { {1}}甚至嵌套在$orderby查询选项中的$expand运算符。


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

$expand

如果只想返回"WorkstationId": "8E5B3291-E092-4091-8C9A-58B7C90E907C",值,则删除其他WorkstationId参数并将$expand添加到扩展中可能更简单:

$select

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

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

如果您只想返回{ "@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
https://doesnotexist/MyApi/api/v1.0/workstations?$expand=Locations&$filter=WorkstationName eq 'LP08'&$select=WorkstationId

如果您不需要位置信息,请完全省略expand子句。