You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:06:03