【问题标题】:filter returns: property is not a single value过滤器返回:属性不是单个值
【发布时间】:2020-09-06 21:22:32
【问题描述】:

我想介绍一下我在使用 OData 过滤器选项时遇到的以下问题。

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

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

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

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

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

【问题讨论】:

    标签: json odata


    【解决方案1】:

    只需将过滤器放在 $expand 中:

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

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

    【讨论】:

      【解决方案2】:

      扩展@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'),AccessDomains,DefaultProfiles&$filter=Workstations/Any(w:w/WorkstationName eq 'LP08')
        

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

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


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

      "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
      
      {
        "@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
              }
            ]
          }
        ]
      }
      
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 2018-01-15
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多