如何在Azure Digital Twins中执行不区分大小写的查询
Azure Digital Twins 实现不区分大小写查询的方案
问题背景
我有一段在Azure Digital Twins中执行查询的C#代码:
query = digitalTwinsClientInstance.QueryAsync<BasicDigitalTwin>( @$"SELECT Child, Child.$metadata.$model FROM DIGITALTWINS ... WHERE Area.$dtId = '{areaId}' AND CONTAINS(Child.Name, '{textFilter}')" );
希望实现不区分大小写的查询,但Azure Digital Twins不支持UPPER或LOWER函数,尝试使用LOWER转换的写法无法生效:
query = digitalTwinsClientInstance.QueryAsync<BasicDigitalTwin>( @$"SELECT Child, Child.$metadata.$model FROM DIGITALTWINS ... WHERE Area.$dtId = '{areaId}' AND CONTAINS(LOWER(Child.Name), '{textFilter.ToLower()}')" // 无法生效 );
可行解决方案
方案1:使用REGEX_MATCH函数实现正则不区分大小写匹配
Azure Digital Twins查询语言支持REGEX_MATCH函数,通过指定忽略大小写的标志'i',可以实现不区分大小写的包含匹配:
// 转义查询文本中的正则特殊字符,避免语法错误 var escapedTextFilter = System.Text.RegularExpressions.Regex.Escape(textFilter); query = digitalTwinsClientInstance.QueryAsync<BasicDigitalTwin>( @$"SELECT Child, Child.$metadata.$model FROM DIGITALTWINS ... WHERE Area.$dtId = '{areaId}' AND REGEX_MATCH(Child.Name, '{escapedTextFilter}', 'i')" );
- 核心逻辑:
REGEX_MATCH的第三个参数'i'开启不区分大小写模式; - 注意事项:必须用
Regex.Escape()处理输入的textFilter,如果文本包含.,*,?等正则特殊字符,不转义会导致匹配逻辑出错。
方案2:新增小写字段预存(适合可修改模型的场景)
如果允许修改数字孪生的模型定义,可以新增一个用于存储小写名称的字段(比如LowercaseName),在创建或更新孪生时同步写入小写格式的名称,之后直接基于该字段做查询:
// 创建/更新孪生时同步设置小写名称字段 var targetTwin = new BasicDigitalTwin { Id = "sample-twin-id", Contents = { ["Name"] = "SampleTwinName", ["LowercaseName"] = "SampleTwinName".ToLowerInvariant() } }; await digitalTwinsClientInstance.UpsertDigitalTwinAsync(targetTwin.Id, targetTwin); // 查询时直接匹配小写字段 query = digitalTwinsClientInstance.QueryAsync<BasicDigitalTwin>( @$"SELECT Child, Child.$metadata.$model FROM DIGITALTWINS ... WHERE Area.$dtId = '{areaId}' AND CONTAINS(Child.LowercaseName, '{textFilter.ToLowerInvariant()}')" );
该方案适合查询频率高、对性能要求较高的场景,避免正则匹配带来的性能开销。
内容的提问来源于stack exchange,提问作者Yan Tavares
相关产品推荐
相关产品推荐

