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

打印 上一主题 下一主题

主题 926|帖子 926|积分 2782

一、需求描述

由于WTM默认只支持查询关系型数据库,但实际生产过程中,我们的数据可能会存在时序数据库。
WTM LayUI的架构下,实现通过查询InfluxDB时序数据库数据,并将数据放到DataTable中。
 
二、解决思路

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

GetSearchQuery方法的实现:
  1.     public override   IOrderedQueryable<HParameterMonitoring_View> GetSearchQuery()
  2.         {
  3.            var list= GetInfluxDBData().Result;
  4.            return  list.AsQueryable().OrderBy(x=>x.HParameterMonitoring_MachineCode);
  5.         }
复制代码
 
 查询InfluxDB数据将其放到List容器中: 
  1.         private async Task<List<HParameterMonitoring_View>> GetInfluxDBData()
  2.         {
  3.             StringBuilder query = new StringBuilder();
  4.             StringBuilder queryCount = new StringBuilder();
  5.             string machineId = Searcher.SelectedMachineId.ToString();
  6.             var dicParm = DC.Set<CMachParm>().CheckContain(Searcher.HPTHAlarmParameterIds, x => x.ID).ToDictionary(s => s.NameEN, v => v);
  7.             // List<string> paraList = dicParm.Keys.ToList();
  8.             List<ParamName> paraList = new List<ParamName>();
  9.             foreach (var para in dicParm)
  10.             {
  11.                 ParamName obj = new ParamName()
  12.                 {
  13.                     Name_Cn = para.Value.NameCN,
  14.                     Name_En = para.Value.NameEN,
  15.                     Unit = para.Value.Unit,
  16.                 };
  17.                 paraList.Add(obj);
  18.             };
  19.             int queryStart = DateHelper.ConvertDateTimeInt(Searcher.DateStart ?? DateTime.Now.AddMinutes(-5));
  20.             int queryEnd = DateHelper.ConvertDateTimeInt(Searcher.DateEnd ?? DateTime.Now);
  21.             List<HParameterMonitoring_View> objList = new List<HParameterMonitoring_View>();
  22.             
  23.             using (var client = InfluxDBClientFactory.Create(Wtm.ConfigInfo.AppSettings["InfluxDBUrl"], Wtm.ConfigInfo.AppSettings["InfluxDBToken"].ToCharArray()))
  24.             {
  25.                 client.EnableGzip();//此方法将数据压缩,就不会导致超时的发生
  26.                 //bool IsGzipEnabled=client.IsGzipEnabled();
  27.                 query.Append($"from(bucket:"{Wtm.ConfigInfo.AppSettings["InfluxDBBucket"]}")");
  28.                 query.Append($@"|> range(start: {queryStart},stop:{queryEnd})");
  29.                 query.Append("|> filter(fn: (r) => r["_measurement"] == "cncinfo")");
  30.                 query.Append($"|> filter(fn: (r) => r["machineId"] == "{machineId}")");
  31.                 if (paraList.Count > 0)
  32.                 {
  33.                     query.Append($"|> filter(fn: (r) => 1!=1");//or  就要是false 因为false或什么 就是什么
  34.                     foreach (var para in paraList)
  35.                     {
  36.                         query.Append($" or r["_field"] == "{para.Name_En}"");//相当于select那些列
  37.                     }
  38.                     query.Append(")");
  39.                 }
  40.                
  41.                 var fluxTable = await client.GetQueryApi().QueryAsync(query.ToString(), Wtm.ConfigInfo.AppSettings["InfluxDBOrg"],cancellationToken:System.Threading.CancellationToken.None);
  42.                 //int z = (Searcher.Page - 1) * Searcher.Limit;
  43.                 for (int i = 0; i < fluxTable.Count; i++)
  44.                 {//i是参数
  45.                     for (int j = 0; j < fluxTable[i].Records.Count; j++)
  46.                     {//j是数据
  47.                         string time = fluxTable[i].Records[j].GetTimeInDateTime()?.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss");
  48.                         string fieldOri = fluxTable[i].Records[j].GetField();
  49.                         Dictionary<string, object> values = fluxTable[i].Records[j].Values;
  50.                         string NameCn = "";
  51.                         string Unit = "";
  52.                         foreach (var item in paraList)
  53.                         {
  54.                             if (item.Name_En == fieldOri)
  55.                             {
  56.                                 NameCn = item.Name_Cn;
  57.                                 Unit = item.Unit;
  58.                             }
  59.                         };
  60.                         HParameterMonitoring_View obj = new HParameterMonitoring_View()
  61.                         {
  62.                             HParameterMonitoring_MachineCode = values["eqname"]?.ToString(),
  63.                             HParameterMonitoring_Param = fieldOri,
  64.                             HParameterMonitoring_ParamCn = NameCn,
  65.                             HParameterMonitoring_Value = values["_value"]?.ToString() + Unit,
  66.                             HParameterMonitoring_UpdateTime = time,
  67.                         };
  68.                         objList.Add(obj);
  69.                     }
  70.                 }
  71.             };
  72.             return objList;
  73.         }
复制代码
 
 
四、改善建议

改善点1:每次查询出来都是不带分页的整个list,然后才进行分页
由于要使用WTM的GetSearchQuery,而WTM的分页和排序是在执行完GetSearchQuery方法之后,故没法分页查询。如果要分页查询,只能自己写查询数据库方法不使用GetSearchQuery方法,而是在查询时序数据库的时候,直接用limit进行分页。
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表