问题描述
我正在尝试编写一个 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
属性的 PartitionKey
和 CosmosDB
属性。例如:
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 触发器的查询参数时都会遇到这种情况,但同样的问题也适用于这种情况。