WTM+InfluxDB時序資料庫數據查詢並放到DataTable中

来源:https://www.cnblogs.com/cherish836138981/archive/2022/12/07/16962487.html
-Advertisement-
Play Games

一、需求描述 由於WTM預設只支持查詢關係型資料庫,但實際生產過程中,我們的數據可能會存在時序資料庫。 WTM LayUI的架構下,實現通過查詢InfluxDB時序資料庫數據,並將數據放到DataTable中。 二、解決思路 通過Influx語法,將數據查詢出來放到List的容器中,然後再在GetS ...


一、需求描述

由於WTM預設只支持查詢關係型資料庫,但實際生產過程中,我們的數據可能會存在時序資料庫。

WTM LayUI的架構下,實現通過查詢InfluxDB時序資料庫數據,並將數據放到DataTable中。

 

二、解決思路

通過Influx語法,將數據查詢出來放到List的容器中,然後再在GetSearchQuery方法中返回。 這樣無論查詢數據放到DataTable還是導出都可以使用。

三、代碼實現

GetSearchQuery方法的實現:

    public override   IOrderedQueryable<HParameterMonitoring_View> GetSearchQuery()
        {
           var list= GetInfluxDBData().Result;
           return  list.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[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<string, object> 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進行分頁。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:賈世聞 我們在開發應用後端系統的時候經常要和各種資料庫、緩存等資源打交道。這一期,我們聊聊如何訪問redis 並將資源池化。 在一個應用後端程式訪問redis主要要做的工作有兩個,單例和池化。 在後端應用集成redis,我們主要用到以下幾個crate:​ ​once_cell​​​、​ ​re ...
  • 1. 版本問題 1.1. Activiti版本 7.1.0-M6是最後一個支持JDK1.8的版本,此後的版本都要求JDK11以上 目前,Activiti最新版本是7.6.0,它是用JDK11編譯的,因此要想使用最新版7.6.0必須升級JDK版本,不能再用1.8 同時,7.6.0依賴的SpringBo ...
  • aliases: [JAVA Lambda] tags : " #Java " summary: [如何使用函數式編程寫出優雅高效的JAVA代碼] author : [yaenli] date : [2022-11-10] 1 簡介 簡潔的代碼就能處理大型數據集合,讓複雜的集合處理演算法高效的運行在多 ...
  • "Writing in C or C++ is like running a chain saw with all the safety guards removed. " - Bob Gray “用C或C++寫代碼就像是在揮舞一把卸掉所有安全防護裝置的鏈鋸。” —— 鮑勃·格雷 0x00 大綱 0 ...
  • keys命令的用法: keys pattern 查找符合正則匹配的key的列表。掃描對象是Redis服務中所有的key,想想都很慢對不對? 同時執行keys命令的同時,Redis進程將被阻塞,無法執行其他命令,假如超過了哨兵的down-after-milliseconds配置,還會進行主從切換,切換 ...
  • 原文鏈接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor項目嵌入 pdf.js 時不能正確顯示中文,瀏覽器F12顯示如下錯誤 錯誤 l10n.js /web/locale/locale.properties not found ...
  • 當我們編寫了自己的C#程式,有程式自定義的文件類型時,通常希望它滿足以下需求:雙擊自定義文件打開自定義程式、自定義文件有著自己的圖標 此時,在網上檢索可以發現,大多數回答是使用Microsoft.Win32下的CreateSubKey(String)函數,但是很不幸,Win10的註冊表項受訪問控制列... ...
  • .NET 6 使用 MagicOnion MagicOnion開源地址:https://github.com/Cysharp/MagicOnion 什麼是MagicOnion? MagicOnion 是用於 .NET 平臺的現代 RPC 框架,它提供雙向實時通信(如SignalR和Socket.io ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...