我正在构建一个使用Azure资源连接器获取资源列表的逻辑应用程序。然后,我想将结果过滤到标记名称为Microsoft.Compute
和stop
的{{1}}资源。
以下是我收到的没有任何过滤器
的资源片段normal
正如您所看到的,底层资源不包含任何标记,就像列表中显示的许多其他标记一样
我使用标准{
"id": "/subscriptions/<subscription>/resourceGroups/Env1/providers/Microsoft.Compute/virtualMachines/MyVM1",
"name": "MyVM1",
"type": "Microsoft.Compute/virtualMachines",
"location": "westeurope",
"tags": {
"stop": "normal"
}
},
{
"id": "/subscriptions/<subscription>/resourceGroups/LogicApp/providers/Microsoft.Logic/workflows/DWSize-Check",
"name": "DWSize-Check",
"type": "Microsoft.Logic/workflows",
"location": "westeurope",
"tags": {}
}
Compose
连接器尝试从我收到的Filter Array
过滤掉。
以下是我希望用于过滤器命令的代码:
value
@and(contains(item()?['id'], '/Microsoft.Compute/virtualMachines/'), contains(item()?['tags'], variables('TagName')), contains(item()?['tags'], variables('TagValue')))
和variables('TagName')
将为variables('TagValue')
和stop
,如我的结果摘要中列出的示例代码中所示。
但是,由于其他资源(例如normal
)中未列出任何标记值,因此收到以下Microsoft.Logic/workflows
错误:
InvalidTemplate。执行模板操作&#39; Filter_array&#39; 失败:评估&#39;查询&#39;行动&#39;其中&#39;表达 &#39; @contains(item()?[&#39; tags&#39;],变量(&#39; TagValue&#39;))&#39;失败了:&#39; The 模板语言功能&#39;包含&#39;期待它的第一个论点 &#39;集合&#39;是一个字典(对象),一个数组或一个字符串。该 提供的值类型为&#39; Null&#39;。&#39;。
有人知道如何解决这个问题吗?
我已尝试对此null
进行类似的查询,只是为了查看它是否收到任何内容,但我仍然被@contains(item().tags?.stop, variables('TagValue'))
响应阻止:(
我在Workflow Definition Language的帮助下尝试了上述内容,但仍然没有骰子。任何帮助将不胜感激。
修改
除了Thomas发布的答案之外,我还执行了以下操作(如下图所示)从结果中过滤出null
并转到null
,但我仍然无法访问TagName
,即使我使用包含:
TagValue
或只是试图寻找@and(contains(item()?['tags'], variables('TagName')), contains(item()?['tags'], variables('TagValue')))
TagValue
答案 0 :(得分:2)
您可以检查null并返回一个空值(在您的情况下为空数组)。
您可以使用此表达式替换item()?['tags']
或创建变量:
if(equals(item()?['tags'], null), [], item()?['tags'])