我想介绍一下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文件;
"@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"
}
]
}
]
}发布于 2020-08-13 13:21:32
只需将筛选器放入$expand中:
https://doesnotexist/MyApi/api/v1.0/locations?$expand=Workstations($filter= WorkstationName eq 'LP08'),AccessDomains,DefaultProfiles
这只会扩展具有此名称的工作站。
发布于 2020-09-06 13:06:34
扩展@Phyxius提供的解决方案,因为您正在查询Locations控制器,而且每个位置都可以有多个工作站将结果集过滤到只有名为"LP08"的工作站的位置,并且旧的返回与过滤器匹配的工作站,我们需要在两个位置应用过滤器:
Any操作符: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可能更简单
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
}
]
}
]
}如果不需要位置信息,则完全省略展开子句。
https://stackoverflow.com/questions/63392962
复制相似问题