将事件网格触发器用于 Azure 函数时,我可以访问绑定表达式中的数据属性吗?

问题描述

我正在尝试编写一个 Azure 函数,它具有一个事件网格触发器和一个 CosmosDB 输入绑定。我想使用来自触发事件网格事件的数据来定义查询的一部分,因此我只能从 Cosmos 获取我需要的文档。

示例事件数据:

{
    "referenceId": "id-43"
}

C# 中的当前函数定义:

public static void Run(
    [EventGridEvent] @event,[CosmosDB(
        databaseName: "%DatabaseName%",collectionName: "%CollectionName%",ConnectionStringSetting = "CosmosConnectionString",sqlQuery = "SELECT * FROM root WHERE root.otherDocId = '{data.referenceId}'"
    )] IEnumerable<Document> documents,ILogger logger)
{
    // Function Body
}

目前,当我尝试发布到该函数时,我遇到了错误Error while accessing 'referenceId': property does not exist.。有没有一种方法可以更改内容以将数据用作 sql 查询中绑定表达式的一部分?

编辑:

我知道可以绑定数据属性,因为我们有另一个函数绑定到 Id 属性PartitionKeyCosmosDB 属性。例如:

public static void Run(
    [EventGridEvent] @event,Id = "{data.idProperty}",PartitionKey = "{data.partitionKeyProperty}"
    )] Document document,ILogger logger)
{
    // Function Body
}

很遗憾,我无法在此实例中使用分区键来过滤文档,必须通过 sql 查询进行。

解决方法

进一步挖掘后,这似乎是一个已知问题,可以通过 azure-webjobs-sdk-extensions GitHub 页面上的此问题看出:https://github.com/Azure/azure-webjobs-sdk-extensions/issues/595

SqlQuery 属性上有一个特定属性,用于控制如何处理参数绑定,并且不适用于嵌套属性。大多数人在使用 Http 触发器的查询参数时都会遇到这种情况,但同样的问题也适用于这种情况。