如何使用C# influxdb-client将InfluxDB v2.0查询结果转换为List<items>?
你可以利用influxdb-client-csharp内置的POCO自动映射能力大幅简化代码,核心只需要两步:调整Flux语句做行转列,直接调用泛型查询方法自动映射到你的Value类,无需手动拆分表、循环赋值。
优化后代码
using InfluxDB.Client; using InfluxDB.Client.Core.Attributes; namespace InfluxDBRead { class Program { static async Task Main(string[] args) { // using自动释放客户端,无需手动调用Dispose using var influxDBClient = InfluxDBClientFactory.Create("http://localhost:8086", "Qlu0fF8tliDLMK-DCbZ-XwcJ9_PiGY5-Dw-LfTCjcgjy8CUA80KaashqCKR77JUAdbIY-O1A3Ar_mz4jgzZy5g=="); // Flux新增pivot做行转列,把同时间点的所有字段合并到同一条记录 var flux = @"from(bucket: ""Development"") |> range(start: -1d) |> filter(fn: (r) => r[""device""] == ""Freezer 01"") |> filter(fn: (r) => r[""_field""] == ""tempBLowAlarm"" or r[""_field""] == ""tempBHighAlarm"" or r[""_field""] == ""tempB"" or r[""_field""] == ""tempALowAlarm"" or r[""_field""] == ""tempAHighAlarm"" or r[""_field""] == ""tempA"" or r[""_field""] == ""levelLowAlarm"" or r[""_field""] == ""levelHighAlarm"" or r[""_field""] == ""level"" or r[""_field""] == ""fillTimeAlarm"" or r[""_field""] == ""bypassTimeAlarm"") |> pivot(rowKey:[""_time""], columnKey: [""_field""], valueColumn: ""_value"")"; // 直接泛型查询自动映射到List<Value> List<Value> values = await influxDBClient.GetQueryApi().QueryAsync<Value>(flux, "Organisation"); } } // 给属性加Column特性匹配Flux返回的驼峰字段名 public class Value { [Column(IsTimestamp = true)] public DateTime DateAndTime { get; set; } [Column("tempA")] public double TempA { get; set; } [Column("tempB")] public double TempB { get; set; } [Column("level")] public double Level { get; set; } [Column("tempAHighAlarm")] public bool TempAHighAlarm { get; set; } [Column("tempBHighAlarm")] public bool TempBHighAlarm { get; set; } [Column("levelHighAlarm")] public bool LevelHighAlarm { get; set; } [Column("tempALowAlarm")] public bool TempALowAlarm { get; set; } [Column("tempBLowAlarm")] public bool TempBLowAlarm { get; set; } [Column("levelLowAlarm")] public bool LevelLowAlarm { get; set; } [Column("fillTimeAlarm")] public bool FillTimeAlarm { get; set; } [Column("bypassTimeAlarm")] public bool BypassTimeAlarm { get; set; } } }
核心优化点
- 去掉了手动拆分不同表记录、循环赋值的冗余逻辑,由客户端自动完成类型转换和属性映射
- Flux增加pivot操作后,同一时间戳的所有字段会聚合到单条记录,避免了原代码依赖表索引顺序的潜在风险(如果返回表的顺序变了,原代码会出现赋值错误)
- 使用using语法自动管理客户端生命周期,无需手动调用Dispose避免资源泄漏
内容的提问来源于stack exchange,提问作者patrickgc
相关产品推荐
相关产品推荐

