C# Azure函数中用IoT Hub SQL查询设备列表遇异常的解决咨询
解决Azure IoT Hub SQL查询返回"result type is Raw"错误的方法
错误原因
当你使用SELECT deviceId,tags.SiteId FROM devices这类仅返回部分字段的查询时,IoT Hub返回的是Raw类型的JSON结果,而非完整的Device实体对象。如果后续代码尝试用GetNextAsAsync<Device>这类强类型方法反序列化,就会触发类型不匹配的错误。Azure门户的查询工具会直接解析Raw JSON,因此能正常显示结果。
解决方法
方法1:使用自定义DTO类接收结果
创建一个与查询返回字段匹配的类:
public class DeviceSiteInfo { public string DeviceId { get; set; } public string SiteId { get; set; } }
修改结果读取逻辑,用该类反序列化:
var query = _registry.CreateQuery("SELECT deviceId,tags.SiteId FROM devices", 100); var deviceList = await query.GetNextAsAsync<DeviceSiteInfo>(); foreach (var device in deviceList) { // 处理device.DeviceId和device.SiteId }
方法2:使用动态类型读取结果
如果不想创建DTO类,可直接用dynamic类型读取Raw结果:
var query = _registry.CreateQuery("SELECT deviceId,tags.SiteId FROM devices", 100); var results = await query.GetNextAsAsync<dynamic>(); foreach (var item in results) { string deviceId = item.deviceId; string siteId = item.tags.SiteId; // 进行后续处理 }
方法3:查询完整设备实体(不推荐)
如果确实需要完整的Device对象,可修改查询语句返回所有字段,但会增加数据传输量:
var query = _registry.CreateQuery("SELECT * FROM devices", 100); var deviceList = await query.GetNextAsAsync<Device>();
内容的提问来源于stack exchange,提问作者Sayli Godage
相关产品推荐
相关产品推荐

