如何从.NET访问Azure Digital Twin批量获取节点特定关系数量?
解决Azure Digital Twin批量统计节点特定关系数量的问题
需求说明
需要统计多个Person节点各自拥有的Friend类型关系数量,最终输出节点名称与对应关系数的列表(如John,3;Harry,2)。
问题分析
直接使用IN配合COUNT()会返回所有匹配关系的总数,而非单个节点的关系数。例如原查询:
SELECT Count() AS what FROM DIGITALTWINS twin JOIN parent RELATED twin.HasDocument WHERE twin.$dtId IN ['John', 'Harry']
只会得到John和Harry的HasDocument关系总数,无法区分每个节点的数量。
解决方案
1. 正确的ADT查询语句
使用GROUP BY按节点$dtId分组,结合COUNT()统计每组的关系数量:
SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount FROM DIGITALTWINS twin JOIN parent RELATED twin.Friend WHERE twin.$dtId IN ['John', 'Harry'] GROUP BY twin.$dtId
如果需要统计所有Person类型节点的关系数量,可替换WHERE条件为模型过滤:
SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount FROM DIGITALTWINS twin JOIN parent RELATED twin.Friend WHERE IS_OF_MODEL(twin, 'dtmi:your:model:Person;1') GROUP BY twin.$dtId
2. C# 代码实现
通过DigitalTwinsClient执行查询,遍历结果并解析为节点名称与关系数的列表:
using Azure.DigitalTwins.Core; using Azure.Identity; using System.Collections.Generic; using System.Text.Json; // 初始化DigitalTwinsClient(替换为你的ADT端点和凭据) string adtEndpoint = "https://your-adt-instance.api.wcus.digitaltwins.azure.net"; var credentials = new DefaultAzureCredential(); var client = new DigitalTwinsClient(new Uri(adtEndpoint), credentials); // 构造查询语句 string query = @"SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount FROM DIGITALTWINS twin JOIN parent RELATED twin.Friend WHERE twin.$dtId IN ['John', 'Harry'] GROUP BY twin.$dtId"; // 执行查询 AsyncPageable<JsonElement> queryResult = client.QueryAsync(query); // 存储结果的列表 var relationCountList = new List<(string NodeName, int RelationCount)>(); // 遍历查询结果 await foreach (JsonElement result in queryResult) { string nodeName = result.GetProperty("NodeName").GetString(); int count = result.GetProperty("RelationCount").GetInt32(); relationCountList.Add((nodeName, count)); } // 示例:输出结果 foreach (var item in relationCountList) { Console.WriteLine($"{item.NodeName}, {item.RelationCount}"); }
关键说明
- 必须使用
GROUP BY twin.$dtId将结果按节点分组,才能得到每个节点的独立统计值。 - 查询返回的是自定义结构(包含
NodeName和RelationCount),因此需要用JsonElement解析,而非直接映射到BasicDigitalTwin。
内容的提问来源于stack exchange,提问作者Babnik
相关产品推荐
相关产品推荐

