从C#查询Kusto数据:如何直接获取JSON格式结果?
优化Kusto C#客户端获取JSON结果的实现方式
你当前的代码手动构建DataTable再序列化的方式不仅冗余,还存在类型处理错误(比如row["ColumnType"].GetType()实际获取的是string类型,而非列的真实数据类型)。下面提供两种更简洁高效的实现方式:
方式一:客户端直接遍历结果构建可序列化对象
直接利用Kusto客户端的IDataReader获取列架构,遍历每行数据构建字典,再序列化为JSON,无需依赖DataTable:
using Newtonsoft.Json; using Kusto.Data.Net.Client; using System.Collections.Generic; using System.Linq; string query = "StormEvents | take 2"; string cluster = "https://help.kusto.windows.net/Samples"; using var client = KustoClientFactory.CreateCslQueryProvider($"{cluster};Fed=true"); using var reader = client.ExecuteQuery(query); var results = new List<Dictionary<string, object>>(); // 获取所有列名 var columnNames = reader.GetColumnSchema().Select(c => c.ColumnName).ToList(); while (reader.Read()) { var rowData = new Dictionary<string, object>(); foreach (var column in columnNames) { int ordinal = reader.GetOrdinal(column); // 处理空值 rowData[column] = reader.IsDBNull(ordinal) ? null : reader.GetValue(ordinal); } results.Add(rowData); } // 序列化为JSON string jsonResult = JsonConvert.SerializeObject(results);
优势
- 避免
DataTable的额外内存开销和类型转换错误 - 代码更简洁,直接映射原始数据类型
- 易于扩展(比如转成强类型对象而非字典)
方式二:让Kusto服务端直接返回JSON结果
通过Kusto查询运算符让服务端直接生成JSON,客户端只需读取结果字符串,进一步减少客户端计算量:
using Kusto.Data.Net.Client; using System.Text; string query = "StormEvents | take 2 | serialize json"; // 让每行输出为JSON字符串 string cluster = "https://help.kusto.windows.net/Samples"; using var client = KustoClientFactory.CreateCslQueryProvider($"{cluster};Fed=true"); using var reader = client.ExecuteQuery(query); var jsonBuilder = new StringBuilder("["); bool isFirstRow = true; while (reader.Read()) { if (!isFirstRow) { jsonBuilder.Append(","); } jsonBuilder.Append(reader.GetString(0)); isFirstRow = false; } jsonBuilder.Append("]"); string jsonResult = jsonBuilder.ToString();
说明
serialize json运算符会将每行数据序列化为JSON对象,服务端直接输出字符串- 客户端只需拼接每行的JSON字符串为数组格式,适合大数据量场景
- 若需要更定制化的JSON结构,可结合
pack_all()函数(如StormEvents | take 2 | project json = pack_all())
异步场景优化
如果是异步应用,推荐使用异步查询方法提升性能:
using Newtonsoft.Json; using Kusto.Data.Net.Client; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; async Task<string> GetKustoJsonAsync() { string query = "StormEvents | take 2"; string cluster = "https://help.kusto.windows.net/Samples"; using var client = KustoClientFactory.CreateCslQueryProvider($"{cluster};Fed=true"); using var reader = await client.ExecuteQueryAsync(query); var results = new List<Dictionary<string, object>>(); var columnNames = reader.GetColumnSchema().Select(c => c.ColumnName).ToList(); while (await reader.ReadAsync()) { var rowData = new Dictionary<string, object>(); foreach (var column in columnNames) { int ordinal = reader.GetOrdinal(column); rowData[column] = await reader.IsDBNullAsync(ordinal) ? null : reader.GetValue(ordinal); } results.Add(rowData); } return JsonConvert.SerializeObject(results); }
内容的提问来源于stack exchange,提问作者novice8989
相关产品推荐
相关产品推荐

