Azure Cosmos DB GUID场景参数化查询语法问题求助
解决Cosmos DB参数化查询动态属性名的问题
针对你使用Microsoft.Azure.Cosmos v3.29.0时遇到的动态属性名参数化查询问题,正确的做法是通过遍历body的属性键来匹配参数值,以下是两种可行的实现方式:
方案1:遍历属性键与值,精准匹配
var query = new QueryDefinition( @"SELECT f.myValue FROM c JOIN key IN OBJECT_KEYS(c.body) JOIN f IN OBJECT_VALUES(c.body) WHERE key = @internalId AND c.id = @documentId" ) .WithParameter("@internalId", strInternalGuid) .WithParameter("@documentId", "SomeGuid");
方案2:简化遍历逻辑,直接取值
var query = new QueryDefinition( @"SELECT value c.body[key].myValue FROM c JOIN key IN OBJECT_KEYS(c.body) WHERE key = @internalId AND c.id = @documentId" ) .WithParameter("@internalId", strInternalGuid) .WithParameter("@documentId", "SomeGuid");
为什么之前的写法失效?
- 带引号的参数写法:
c.body['@internalId']或c.body["@internalId"]会被Cosmos DB解析为字面量字符串,它会去匹配键名为@internalId的属性,而非将@internalId视为参数,所以无结果返回。 - 不带引号的参数写法:
c.body[@internalId]违反Cosmos DB SQL语法规则,该语法不允许直接将参数作为属性键名使用,因此触发语法错误。 - 参数值加引号:即使给参数值拼接引号,也会导致实际匹配的是带引号的键名(比如
'xxx-guid'),而你的数据中键名本身不带引号,同时语法层面仍不支持参数作为键名,所以依然报错。
内容的提问来源于stack exchange,提问作者QuinnG
相关产品推荐
相关产品推荐

