首页 > 数据库 >在netcore中使用Influxdb2

在netcore中使用Influxdb2

时间:2024-10-29 17:44:23浏览次数:4  
标签:string netcore Influxdb2 await static ex 使用 var query

Program.cs

using InfluxDB.Client.Api.Domain;
using InfluxDB.Client.Writes;
using Influxdb2.Demo.model.db;
using Influxdb2.Demo.model.dto;

namespace Influxdb2.Demo
{
    internal class Program
    {
        static string url = "http://127.0.0.1:8086";
        static string token = "kYFVcao_7JqOMr_QHztGi4kpy-y0Z7MoqZVWu4rix-PNpzszWxcVFrMij8MAJWqObcXcLhrZ5D08BZxUQtsVlw==";  // token
        static string org = "abc";//用户组
        static string bucket = "a1";//数据库

        static void Main(string[] args)
        {
            Test();

            Console.ReadLine();
        }

        static async Task Test()
        {
            InfluxdbUtil.Init(url, token, org, bucket);

            // 记录格式插入(table,tag1=val1,tag2=val2 field1=a,field2=b)
            string record = $"Park,ParkNo=JLM01,ParkName=aa Flg=\"A\",Space=12i";
            await InfluxdbUtil.WriteRecord(record);

            // 数据点格式写入
            List<PointData> lstPoint = new List<PointData>();
            var pointTag = PointData.Measurement("Park")
                                  .Tag("ParkNo", "JLM02")
                                  .Tag("ParkName", "bb")
                                  .Timestamp(DateTime.UtcNow, WritePrecision.Ns);
            lstPoint.Add(pointTag.Field("Flg", "A"));
            lstPoint.Add(pointTag.Field("Space", 13));
            await InfluxdbUtil.WritePoints(lstPoint);

            // 实体格式插入
            var model = new Park { ParkNo = "JLM03", ParkName = "cc", Space = 11, Timestamp = DateTime.UtcNow };
            await InfluxdbUtil.WriteModel(model);

            // linq查询
            var lstLinq1 = InfluxdbUtil.GetAll();
            var lstLinq2 = InfluxdbUtil.GetBy("", null, null);
            var avg1 = lstLinq2?.Average(p => p.Space);

            // 语句查询 
            var lstFlux11 = await InfluxdbUtil.QueryAll<Park>();// model
            var lstFlux12 = await InfluxdbUtil.QueryAll<ParkDto>("Park");// dto

            //
            // 过滤查询:time + where + order
            string startTime = "2024-10-29T00:00:00Z";
            string endTime = "2024-10-30T00:00:00Z";
            string temp2 =
                      $@"from(bucket: ""{bucket}"")
                      |> range(start:{startTime}, stop:{endTime})  
                      |> filter(fn: (r) => r[""_measurement""] == ""Park"")
                      |> pivot(rowKey: [""_time""], columnKey: [""_field""], valueColumn: ""_value"")
                      |> sort(columns: [""_time""], desc: true)
                      |> filter(fn: (r) => r[""Space""]>12)";
            var lstFlux2 = await InfluxdbUtil.QueryList<Park>(temp2);

            // 公式计算:求平均值
            string temp1 =
                        $@"from(bucket: ""{bucket}"")
                          |> range(start: -3d)
                          |> filter(fn: (r) =>  r._measurement == ""Park"" and r[""_field""] == ""Space"") 
                          |> mean()
                          |> keep(columns: [""_value""])";
            var avg2 = await InfluxdbUtil.QueryOne(temp1);

            // 语句插入(按天分表) 
            var dtStart = new DateTime(1970, 1, 1).ToUniversalTime();
            var dtNow = DateTime.UtcNow;
            string table = "log" + dtNow.ToString("yyyyMMdd");
            string key = dtNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
            int value = (int)(dtNow - dtStart).TotalSeconds;

            string data = $"{table},CarNo=JLM02 Flg=\"A\",Money=5.5,LogTime=\"{key}\",LogTimestamp={value}i";
            await InfluxdbUtil.WriteRecord(data);

            // 语句查询
            var start = (int)(Convert.ToDateTime("2024-10-28 00:00:00").ToUniversalTime() - dtStart).TotalSeconds;
            string temp3 =
                      $@"from(bucket: ""{bucket}"")
                      |> range(start:0)  
                      |> filter(fn: (r) => r[""_measurement""] == ""{table}"")
                      |> pivot(rowKey: [""_time""], columnKey: [""_field""], valueColumn: ""_value"")
                      |> sort(columns: [""_time""], desc: true)
                      |> filter(fn: (r) => r[""LogTimestamp""]>={start})"; 
            var lstLog = await InfluxdbUtil.QueryList<LogDto>(temp3);

            Console.Write("End");
        }
    }
}

InfluxdbUtil.cs

using InfluxDB.Client;
using InfluxDB.Client.Api.Domain;
using InfluxDB.Client.Core.Flux.Domain;
using InfluxDB.Client.Linq;
using InfluxDB.Client.Writes;
using Influxdb2.Client;
using Influxdb2.Demo.model.db;

namespace Influxdb2.Demo
{
    public class InfluxdbUtil : IDisposable
    {
        static InfluxDBClient influxdb;
        static string DefaultBucket;
        static string DefaultOrg;
        static WriteApiAsync WriteApiAsync;
        static QueryApi QueryApi;
        static QueryApiSync QueryApiSync;// linq
        static DateTime dtStart = new DateTime(1970, 1, 1).ToLocalTime();
        static string DeafultFlg = "A";

        /// <summary>
        /// 初始化
        /// </summary>
        public static void Init(string url, string token, string org, string bucket)
        {
            influxdb = new InfluxDBClient(url, token);
            DefaultOrg = org;
            DefaultBucket = bucket;
            WriteApiAsync = influxdb.GetWriteApiAsync();
            QueryApi = influxdb.GetQueryApi();
            QueryApiSync = influxdb.GetQueryApiSync();
        }

        /// <summary>
        /// 记录格式写入
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static async Task WriteRecord(string data)
        {
            try
            {
                await WriteApiAsync.WriteRecordAsync(data, WritePrecision.Ns, DefaultBucket, DefaultOrg);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        /// <summary>
        /// 数据点格式写入(单个)
        /// </summary>
        /// <returns></returns>
        public static async Task WritePoint(PointData point)
        {
            try
            {
                await WriteApiAsync.WritePointAsync(point, DefaultBucket, DefaultOrg);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        /// <summary>
        /// 数据点格式写入(多个)
        /// </summary>
        /// <param name="points"></param>
        /// <returns></returns>
        public static async Task WritePoints(List<PointData> points)
        {
            try
            {
                await WriteApiAsync.WritePointsAsync(points, DefaultBucket, DefaultOrg);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        /// <summary>
        /// 实体格式写入
        /// </summary> 
        public static async Task WriteModel<T>(T t)
        {
            try
            {
                await WriteApiAsync.WriteMeasurementAsync(t, WritePrecision.Ns, DefaultBucket, DefaultOrg);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        /// <summary>
        /// Linq查询所有
        /// </summary> 
        public static List<Park> GetAll()
        {
            try
            {
                var query = from s in InfluxDBQueryable<Park>.Queryable(DefaultBucket, DefaultOrg, QueryApiSync)
                            select s;
                query = query.Where(x => x.Flg == DeafultFlg);// 增加默认过滤项,解决多查询一条null记录
                var datas = query.ToList();
                return datas;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return null;
        }

        /// <summary>
        /// Linq查询where
        /// </summary> 
        public static List<Park> GetBy(string tag, DateTime? stime, DateTime? etime)
        {
            try
            {
                var query = from s in InfluxDBQueryable<Park>.Queryable(DefaultBucket, DefaultOrg, QueryApiSync)
                            select s;
                query = query.Where(x => x.Flg == DeafultFlg);
                if (!string.IsNullOrEmpty(tag))
                {
                    query = query.Where(x => x.ParkNo == tag);
                }
                if (stime.HasValue)
                {
                    var tim = stime.Value;
                    query = query.Where(x => x.Timestamp >= new DateTime(tim.Year, tim.Month, tim.Day, tim.Hour-8, tim.Minute, tim.Second, DateTimeKind.Utc));
                }
                if (etime.HasValue)
                {
                    var tim = etime.Value;
                    query = query.Where(x => x.Timestamp < new DateTime(tim.Year, tim.Month, tim.Day, tim.Hour-8, tim.Minute, tim.Second, DateTimeKind.Utc));
                }
                var datas = query.ToList();
                return datas;
            } 
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return null;
        }

        /// <summary>
        /// Fux语法查询所有
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static async Task<List<T>> QueryAll<T>(string men = "")
        {
            if (string.IsNullOrEmpty(men)) men = typeof(T).Name;
            //
            // 这里借用Influxdb2.Client的Flux对象辅助生成查询字符串
            /*
            from(bucket: "a1")
            |> range(start: -3d)
            |> filter(fn: (r) => r._measurement == "park")
            |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
            |> sort(columns: ["_time"], desc: true)
            |> limit(n: 10, offset: 0)*/

            var flux = Flux
                .From(DefaultBucket)
                .Range("-3d")
                .Filter(FnBody.R.MeasurementEquals($"{men}"))
                .Pivot()
                .Sort(Columns.Time, desc: true)
                .Limit(10)
                ;

            var strflux = flux.ToString();

            var lstData = await QueryList<T>(strflux);

            return lstData;
        }

        public static async Task<List<T>> QueryList<T>(string strflux)
        {
            try
            {
                var query = await QueryApi.QueryAsync<T>(strflux, DefaultOrg);
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return null;
        }

        public static async Task<List<FluxTable>> QueryTable(string strflux)
        {
            try
            { 
                var query = await QueryApi.QueryAsync(strflux, DefaultOrg);
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return null;
        } 

        public static async Task<object> QueryOne(string strflux)
        {
            try
            { 
                var query = await QueryApi.QueryAsync(strflux, DefaultOrg);
                var table = query.FirstOrDefault(); 
                return table == null ? null : table.Records[0].Values["_value"];
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return null;
        }


        public void Dispose()
        {
            influxdb.Dispose();
        }
    }
}

 

标签:string,netcore,Influxdb2,await,static,ex,使用,var,query
From: https://www.cnblogs.com/chen1880/p/18514029

相关文章

  • layui下拉框xm-select自定义搜索使用方法
    xm-select介绍始于Layui,下拉选择框的多选解决方案git地址:https://gitee.com/maplemei/xm-select文档说明:https://codecp.tech/static/xm-select/#/component/options什么情况下使用下拉框的数据量比较大需要支持下拉框的搜索如何使用自定义搜索引用xm-select,使用最......
  • 【VMware VCF】使用 Offline Bundle Transfer Utility(OBTU)配置 VCF 脱机库。
    VMwareCloudFoundation环境中,软件包仓库的来源支持两种方式,分别是OnlineDepot和OfflineDepot。第一种方式,是在VCF环境能够连接互联网的情况下,仅需要配置账号密码后,就可以直接从VMware官方在线存储库获取软件包;第二种方式,是在VCF环境不能连接互联网的情况下,通过在本......
  • 如何使用数据分析进行市场细分和目标市场分析
    市场细分和目标市场分析是高效营销的关键步骤。通过运用数据分析,公司能够识别出具有共同特征的潜在消费者群体、深入了解他们的需求和偏好、评估市场潜力和竞争局势,并制定相应的营销策略。特别是在开展市场细分时,数据分析可帮助确定不同顾客群体对产品或服务的不同反应,从而提供定......
  • 在 ASP.NET Core 中使用 EF Core 进行开启事务工作单元(Unit of Work) 仓储层,服务层模式
    在ASP.NETCore中使用EntityFrameworkCore实现一个带有事务的工作单元(UnitofWork)模式的仓储层和服务层,可以确保在执行多个数据库操作时具有原子性。这样,即使某个操作出现错误,所有操作也可以回滚。以下是如何实现这个模式的详细步骤:定义实体类我们首先定义一个简单的实......
  • 实验三 JSP内置对象使用
    1.完整代码下载:实验三代码2.完整代码下载:实验四代码2.导入代码到eclipse运行【如何处理导入后的报错】......
  • 实验四 JavaBean及Servlet使用
    1.完整代码下载:实验三代码2.完整代码下载:实验四代码2.导入代码到eclipse运行【如何处理导入后的报错】......
  • 【Swagger】Swagger2和Swagger3使用API文档的可视化工具(xiaoymin)
    Swagger时接口文档生成工具,在前后端分离时代很好用。不过,当接口多了,看起来不太符合国人的习惯。因为:缺乏搜索功能接口类多起来,找接口有如大海捞针。接口边上,没有带着接口注释看Model,需要拖拽到最后,没有很自然的切换。所以,xiaoymin在swagger的基础上,做到了更好的可视化......
  • vim的基本使用和插件基础
    一、vim简介vim是一个文本编辑器,在Unix以及类Unix系统中广泛使用,与Emacs并列为两大类Unix操作系统编辑器。vim前身是vi编辑器,vim是vi的扩展。早期vim开发者只是为了完全复制vi以供自己使用,但后来vim被移植到Unix上,之后vim被加入了更多的功能。最后在版本的不断迭代以及更多开......
  • 如何使用C#和Windows Forms创建一个选课系统
    文章目录系统概述1.环境准备2.创建项目3.设计界面4.编写代码代码逻辑结构、系统概述如何使用C#和WindowsForms来创建一个简单的选课系统。1.环境准备在开始之前,请确保开发环境中安装了以下组件:VisualStudio:一个集成开发环境,用于编写和运行C#代码。.NE......
  • 无感染区风灵月影十九项修改器功能介绍及使用说明
    无感染区十九项修改器,功能强大,涵盖无限生命、子弹、载具无敌及快速搜刮等,全面解锁游戏内所有消耗项目。它打造极致舒适的游戏环境,让玩家畅享无忧玩法,体验全方位的游戏乐趣。无论是挑战高难度关卡,还是享受悠闲游戏时光,这款修改器都是你的不二之选。有需求的朋友切勿错过,让游戏体......