private void SetExtendedProperties()
        {
            // extended properties stored in single 'Value' column as key value pair in json string
            // todo visualize record
            string columnName       = "Value";
            string extendedProperty = "Cursor";
            string tableName        = "@ExtendedProperties";

            if (TableOfContents.Rows.Any(x => x.Name.Equals(tableName)))
            {
                long index = TableOfContents.Rows.FirstOrDefault(x => x.Name.Equals(tableName)).Ordinal;
                ExtendedPropertiesTable = new KustoRestTable(ResponseDataSet.Tables[index]);
                Dictionary <string, object> jsonString = ExtendedPropertiesTable.Records().FirstOrDefault(record => record[columnName].ToString().Contains(extendedProperty));

                if (jsonString != null)
                {
                    JObject jObject = (JObject)JsonConvert.DeserializeObject(jsonString[columnName].ToString());
                    Cursor = $"'{jObject.GetValue(extendedProperty)}'";
                }
            }
        }
        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>());
            }
        }