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>()); } }