WTM+InfluxDB时序数据库数据查询并放到DataTable中
一、需求描述由于WTM默认只支持查询关系型数据库,但实际生产过程中,我们的数据可能会存在时序数据库。
WTM LayUI的架构下,实现通过查询InfluxDB时序数据库数据,并将数据放到DataTable中。
二、解决思路
通过Influx语法,将数据查询出来放到List的容器中,然后再在GetSearchQuery方法中返回。 这样无论查询数据放到DataTable还是导出都可以使用。
三、代码实现
GetSearchQuery方法的实现:
public override IOrderedQueryable<HParameterMonitoring_View> GetSearchQuery()
{
var list= GetInfluxDBData().Result;
returnlist.AsQueryable().OrderBy(x=>x.HParameterMonitoring_MachineCode);
}
查询InfluxDB数据将其放到List容器中:
private async Task<List<HParameterMonitoring_View>> GetInfluxDBData()
{
StringBuilder query = new StringBuilder();
StringBuilder queryCount = new StringBuilder();
string machineId = Searcher.SelectedMachineId.ToString();
var dicParm = DC.Set<CMachParm>().CheckContain(Searcher.HPTHAlarmParameterIds, x => x.ID).ToDictionary(s => s.NameEN, v => v);
// List<string> paraList = dicParm.Keys.ToList();
List<ParamName> paraList = new List<ParamName>();
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<HParameterMonitoring_View> objList = new List<HParameterMonitoring_View>();
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.Records.Count; j++)
{//j是数据
string time = fluxTable.Records.GetTimeInDateTime()?.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss");
string fieldOri = fluxTable.Records.GetField();
Dictionary<string, object> values = fluxTable.Records.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进行分页。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]