You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:17:44