最新要闻

广告

手机

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

票房这么火爆,如何请视障人士“看”一场电影?

票房这么火爆,如何请视障人士“看”一场电影?

家电

WTM+InfluxDB时序数据库数据查询并放到DataTable中

来源:博客园


【资料图】

一、需求描述

由于WTM默认只支持查询关系型数据库,但实际生产过程中,我们的数据可能会存在时序数据库。

WTM LayUI的架构下,实现通过查询InfluxDB时序数据库数据,并将数据放到DataTable中。

二、解决思路

通过Influx语法,将数据查询出来放到List的容器中,然后再在GetSearchQuery方法中返回。这样无论查询数据放到DataTable还是导出都可以使用。

三、代码实现

GetSearchQuery方法的实现:

public override   IOrderedQueryable GetSearchQuery()        {           var list= GetInfluxDBData().Result;           return  list.AsQueryable().OrderBy(x=>x.HParameterMonitoring_MachineCode);        }

查询InfluxDB数据将其放到List容器中:

private async Task> GetInfluxDBData()        {            StringBuilder query = new StringBuilder();            StringBuilder queryCount = new StringBuilder();            string machineId = Searcher.SelectedMachineId.ToString();            var dicParm = DC.Set().CheckContain(Searcher.HPTHAlarmParameterIds, x => x.ID).ToDictionary(s => s.NameEN, v => v);            // List paraList = dicParm.Keys.ToList();            List paraList = new List();            foreach (var para in dicParm)            {                ParamName obj = new ParamName()                {                    Name_Cn = para.Value.NameCN,                    Name_En = para.Value.NameEN,                    Unit = para.Value.Unit,                };                paraList.Add(obj);            };            int queryStart = DateHelper.ConvertDateTimeInt(Searcher.DateStart ?? DateTime.Now.AddMinutes(-5));            int queryEnd = DateHelper.ConvertDateTimeInt(Searcher.DateEnd ?? DateTime.Now);            List objList = new List();                        using (var client = InfluxDBClientFactory.Create(Wtm.ConfigInfo.AppSettings["InfluxDBUrl"], Wtm.ConfigInfo.AppSettings["InfluxDBToken"].ToCharArray()))            {                client.EnableGzip();//此方法将数据压缩,就不会导致超时的发生                //bool IsGzipEnabled=client.IsGzipEnabled();                query.Append($"from(bucket:\"{Wtm.ConfigInfo.AppSettings["InfluxDBBucket"]}\")");                query.Append($@"|> range(start: {queryStart},stop:{queryEnd})");                query.Append("|> filter(fn: (r) => r[\"_measurement\"] == \"cncinfo\")");                query.Append($"|> filter(fn: (r) => r[\"machineId\"] == \"{machineId}\")");                if (paraList.Count > 0)                {                    query.Append($"|> filter(fn: (r) => 1!=1");//or  就要是false 因为false或什么 就是什么                    foreach (var para in paraList)                    {                        query.Append($" or r[\"_field\"] == \"{para.Name_En}\"");//相当于select那些列                    }                    query.Append(")");                }                               var fluxTable = await client.GetQueryApi().QueryAsync(query.ToString(), Wtm.ConfigInfo.AppSettings["InfluxDBOrg"],cancellationToken:System.Threading.CancellationToken.None);                //int z = (Searcher.Page - 1) * Searcher.Limit;                for (int i = 0; i < fluxTable.Count; i++)                {//i是参数                    for (int j = 0; j < fluxTable[i].Records.Count; j++)                    {//j是数据                        string time = fluxTable[i].Records[j].GetTimeInDateTime()?.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss");                        string fieldOri = fluxTable[i].Records[j].GetField();                        Dictionary values = fluxTable[i].Records[j].Values;                        string NameCn = "";                        string Unit = "";                        foreach (var item in paraList)                        {                            if (item.Name_En == fieldOri)                            {                                NameCn = item.Name_Cn;                                Unit = item.Unit;                            }                        };                        HParameterMonitoring_View obj = new HParameterMonitoring_View()                        {                            HParameterMonitoring_MachineCode = values["eqname"]?.ToString(),                            HParameterMonitoring_Param = fieldOri,                            HParameterMonitoring_ParamCn = NameCn,                            HParameterMonitoring_Value = values["_value"]?.ToString() + Unit,                            HParameterMonitoring_UpdateTime = time,                        };                        objList.Add(obj);                    }                }            };            return objList;        }

四、改善建议

改善点1:每次查询出来都是不带分页的整个list,然后才进行分页

由于要使用WTM的GetSearchQuery,而WTM的分页和排序是在执行完GetSearchQuery方法之后,故没法分页查询。如果要分页查询,只能自己写查询数据库方法不使用GetSearchQuery方法,而是在查询时序数据库的时候,直接用limit进行分页。

关键词: 数据查询 可以使用 改善建议