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);
                }
                //typeof((tableOfContents.Columns.First(x => x.ColumnName.Equals("Id")).DataType)
                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();
                //list.Add(row.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);
                queryTimer        = new Timer(DisposeQueryClient, null, maxKustoClientTimeMs, maxKustoClientTimeMs);
            }

            try
            {
                queryTimer.Change(maxKustoClientTimeMs, maxKustoClientTimeMs);

                /*
                 * if (query.Trim().StartsWith("."))
                 * {
                 *  return EnumerateResults(_kustoQueryClient.ExecuteQuery(DatabaseName, query, null));
                 * }
                 * else
                 * {
                 *  // unable to parse multiple tables v1 or v2 using kusto so using httpclient and rest
                 *  return EnumerateResults(_kustoQueryClient.ExecuteQueryV2Async(DatabaseName, query, null).Result);
                 *  //xxDataSet t = (DataSet)_kustoQueryClient.ExecuteQueryV2Async(DatabaseName, query, null).Result;
                 * }
                 */
                //test
                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;
                _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 // if (responseDataSet.Tables.Length == 1)
                {
                    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>());
            }
        }