public List <string> Query(string query)
        {
            Log.Info($"query:{query}", ConsoleColor.Blue);

            if (_kustoQueryClient == null)
            {
                _kustoQueryClient = KustoClientFactory.CreateCslQueryProvider(ManagementConnection);
                queryTimer        = new Timer(DisposeQueryClient, null, maxKustoClientTimeMs, maxKustoClientTimeMs);
            }

            try
            {
                queryTimer.Change(maxKustoClientTimeMs, maxKustoClientTimeMs);
                // unable to parse multiple tables v1 or v2 using kusto so using httpclient and rest
                string requestBody = "{ \"db\": \"" + DatabaseName + "\", \"csl\": \"" + query + "\" }";
                string requestId   = new Guid().ToString();

                Dictionary <string, string> headers = new Dictionary <string, string>();
                headers.Add("accept", "application/json");
                headers.Add("host", HostName);
                headers.Add("x-ms-client-request-id", requestId);

                Log.Info($"query:", requestBody);
                _httpClient.DisplayResponse = Config.LogDebug >= LoggingLevel.Verbose;
                _httpClient.SendRequest(uri: RestQueryUri, authToken: _arm.BearerToken, jsonBody: requestBody, httpMethod: HttpMethod.Post, headers: headers);
                ResponseDataSet = JsonConvert.DeserializeObject <KustoRestResponseV1>(_httpClient.ResponseStreamString);

                if (!ResponseDataSet.HasData())
                {
                    Log.Info($"no tables:", ResponseDataSet);
                    return(new List <string>());
                }

                KustoRestTableOfContentsV1 toc = SetTableOfContents(ResponseDataSet);

                if (toc.HasData)
                {
                    SetExtendedProperties();

                    long index = toc.Rows.FirstOrDefault(x => x.Kind.Equals("QueryResult")).Ordinal;
                    PrimaryResultTable = new KustoRestTable(ResponseDataSet.Tables[index]);
                    return(PrimaryResultTable.RecordsCsv());
                }
                else
                {
                    TableOfContents         = new KustoRestTableOfContentsV1();
                    Cursor                  = "''";
                    ExtendedPropertiesTable = new KustoRestTable();
                    PrimaryResultTable      = new KustoRestTable(ResponseDataSet.Tables[0]);
                    return(PrimaryResultTable.RecordsCsv());
                }
            }
            catch (Exception e)
            {
                Log.Exception($"exception executing query: {query}\r\n{e}");
                return(new List <string>());
            }
        }
        private KustoRestTableOfContentsV1 SetTableOfContents(KustoRestResponseV1 responseDataSet)
        {
            KustoRestTableOfContentsV1 content = new KustoRestTableOfContentsV1();

            if (responseDataSet == null || responseDataSet.Tables?.Length < 2)
            {
                Log.Debug($"no table of content table");
                return(content);
            }

            KustoRestResponseTableV1 tableOfContents = responseDataSet.Tables.Last();

            for (int c = 0; c < tableOfContents.Columns.Length; c++)
            {
                content.Columns.Add(
                    new KustoRestTableOfContentsColumnV1
                {
                    _index     = c,
                    ColumnName = tableOfContents.Columns[c].ColumnName,
                    ColumnType = tableOfContents.Columns[c].ColumnType,
                    DataType   = tableOfContents.Columns[c].DataType
                });
            }

            for (int r = 0; r < tableOfContents.Rows.Length; r++)
            {
                Hashtable record = new Hashtable();
                KustoRestTableOfContentsRowV1 row = new KustoRestTableOfContentsRowV1();

                object[] rowFields = tableOfContents.Rows[r];
                if (rowFields.Length != tableOfContents.Columns.Length)
                {
                    Log.Error($"mismatch in column count and row count {rowFields.Count()} {tableOfContents.Columns.Length}");
                    return(content);
                }

                row._index     = r;
                row.Id         = rowFields[content.Columns.First(x => x.ColumnName.Equals("Id"))._index].ToString();
                row.Kind       = rowFields[content.Columns.First(x => x.ColumnName.Equals("Kind"))._index].ToString();
                row.Name       = rowFields[content.Columns.First(x => x.ColumnName.Equals("Name"))._index].ToString();
                row.Ordinal    = Convert.ToInt64(rowFields[content.Columns.First(x => x.ColumnName.Equals("Ordinal"))._index]);
                row.PrettyName = rowFields[content.Columns.First(x => x.ColumnName.Equals("PrettyName"))._index].ToString();
                content.Rows.Add(row);
            }

            return(content);
        }
        public List <string> Query(string query)
        {
            Log.Info($"query:{query}", ConsoleColor.Blue);

            if (_kustoQueryClient == null)
            {
                _kustoQueryClient = KustoClientFactory.CreateCslQueryProvider(ManagementConnection);
            }

            if (queryTimer == null)
            {
                queryTimer = new Timer(DisposeQueryClient, null, maxKustoClientTimeMs, maxKustoClientTimeMs);
            }

            try
            {
                PrimaryResultTable = null;
                QueryResultTables.Clear();
                Cursor = null;

                queryTimer.Change(maxKustoClientTimeMs, maxKustoClientTimeMs);
                // unable to parse multiple tables v1 or v2 using kusto so using httpclient and rest
                string requestBody = "{ \"db\": \"" + DatabaseName + "\", \"csl\": \"" + query + ";print Cursor=current_cursor()\" }";
                string requestId   = new Guid().ToString();

                Dictionary <string, string> headers = new Dictionary <string, string>();
                headers.Add("accept", "application/json");
                headers.Add("host", HostName);
                headers.Add("x-ms-client-request-id", requestId);

                Log.Info($"query:", requestBody);
                _httpClient.SendRequest(uri: RestQueryUri, authToken: _arm.BearerToken, jsonBody: requestBody, httpMethod: HttpMethod.Post, headers: headers);
                ResponseDataSet = JsonConvert.DeserializeObject <KustoRestResponseV1>(_httpClient.ResponseStreamString);

                if (!ResponseDataSet.HasData())
                {
                    Log.Info($"no tables:", ResponseDataSet);
                    return(new List <string>());
                }

                KustoRestTableOfContentsV1 toc = SetTableOfContents(ResponseDataSet);

                if (toc.HasData)
                {
                    SetExtendedProperties();
                    List <long> indexes = toc.Rows.Where(x => x.Kind.Equals("QueryResult")).Select(x => x.Ordinal).ToList();

                    foreach (long index in indexes)
                    {
                        KustoRestTable table = new KustoRestTable(ResponseDataSet.Tables[index]);
                        QueryResultTables.Add(table);

                        if (PrimaryResultTable == null)
                        {
                            PrimaryResultTable = table;
                            continue;
                        }

                        if (table.Columns.FirstOrDefault(x => x.ColumnName.Contains("Cursor")) != null)
                        {
                            Cursor = table.Records().FirstOrDefault()["Cursor"].ToString();
                        }
                    }

                    Log.Debug($"table cursor: {Cursor}");
                    return(PrimaryResultTable.RecordsCsv());
                }
                else
                {
                    TableOfContents         = new KustoRestTableOfContentsV1();
                    ExtendedPropertiesTable = new KustoRestTable();
                    PrimaryResultTable      = new KustoRestTable(ResponseDataSet.Tables[0]);
                    ResponseDataSet.Tables.ForEach(x => QueryResultTables.Add(new KustoRestTable(x)));

                    return(PrimaryResultTable.RecordsCsv());
                }
            }
            catch (Exception e)
            {
                Log.Exception($"exception executing query: {query}\r\n{e}");
                return(new List <string>());
            }
        }