C# 使用ADOMDClient解析Azure函数中JSON的Azure分析响应

C# 使用ADOMDClient解析Azure函数中JSON的Azure分析响应,c#,json.net,azure-functions,azure-analysis-services,adomd.net,C#,Json.net,Azure Functions,Azure Analysis Services,Adomd.net,我正在使用Microsoft.AnalysisServices.AdomdClient.dll文件连接到Azure Analysis Service,以便在Azure函数中执行DAX查询,我需要它在JSON中吐出。下面是我如何做的,但当有大量记录时,我看到将响应转换为json的延迟。分析服务响应需要2秒,但屏蔽对json的响应需要40秒以上。有人能帮忙建议一个更好的方法吗 AdomdCommand cmd = new AdomdCommand(query, _connect); public L

我正在使用Microsoft.AnalysisServices.AdomdClient.dll文件连接到Azure Analysis Service,以便在Azure函数中执行DAX查询,我需要它在JSON中吐出。下面是我如何做的,但当有大量记录时,我看到将响应转换为json的延迟。分析服务响应需要2秒,但屏蔽对json的响应需要40秒以上。有人能帮忙建议一个更好的方法吗

AdomdCommand cmd = new AdomdCommand(query, _connect);
public List<Dictionary<string, object>> Results { get; } = new List<Dictionary<string, object>>();
var reader = cmd.ExecuteReader();
var schemeTable = reader.GetSchemaTable();
ISet<string> columnSet = new HashSet<string>();
foreach (DataRow row in schemeTable.Rows)
{
 String columnName = row[0].ToString();
 columnSet.Add(columnName);
}
while (reader.Read())
{
 Dictionary<string, object> columns = new Dictionary<string, object>();
 foreach (string columnName in columnSet)
 {
 var value = reader[reader.GetOrdinal(columnName)];
 if (value != null)
 {
  columns.Add(columnName, value);
 }
 else
 {
  columns.Add(columnName, null);
 }
}
 Results.Add(columns);
}
JsonConvert.SerializeObject(Results)
adomdcomd cmd=新的adomdcomd命令(查询,\u连接);
公共列表结果{get;}=new List();
var reader=cmd.ExecuteReader();
var schemeTable=reader.GetSchemaTable();
ISet columnSet=新HashSet();
foreach(schemeTable.Rows中的DataRow行)
{
String columnName=行[0]。ToString();
columnSet.Add(columnName);
}
while(reader.Read())
{
字典列=新字典();
foreach(列集中的字符串columnName)
{
var value=reader[reader.GetOrdinal(columnName)];
if(值!=null)
{
columns.Add(columnName,value);
}
其他的
{
columns.Add(columnName,null);
}
}
结果:添加(列);
}
JsonConvert.SerializeObject(结果)

我在GitHub上有一个示例:。它将结果作为JSON从AdomdDataReader流式传输到输出流。该流可以是MemoryStream或(在我的例子中)HttpResponse流

public static async Task WriteResultsToStream(object results, Stream stream, CancellationToken cancel)
{

    if (results == null)
    {
        return;
    }

    if (results is AdomdDataReader rdr)
    {
        var encoding = new System.Text.UTF8Encoding(false);
        using (var tw = new StreamWriter(stream,encoding,1024*4,true))
        using (var w = new Newtonsoft.Json.JsonTextWriter(tw))
        {

            await w.WriteStartObjectAsync(cancel);
            var rn = "rows";

            await w.WritePropertyNameAsync(rn);
            await w.WriteStartArrayAsync(cancel);

            while (rdr.Read())
            {
                await w.WriteStartObjectAsync(cancel);
                for (int i = 0; i < rdr.FieldCount; i++)
                {
                    string name = rdr.GetName(i);
                    object value = rdr.GetValue(i);

                    await w.WritePropertyNameAsync(name, cancel);
                    await w.WriteValueAsync(value, cancel);
                }
                await w.WriteEndObjectAsync(cancel);
            }

            await w.WriteEndArrayAsync(cancel);
            await w.WriteEndObjectAsync(cancel);

            await w.FlushAsync();
            await tw.FlushAsync();
            await stream.FlushAsync();
        }
    }
    else if (results is CellSet  cs)
    {
        throw new NotSupportedException("CellSet results");

    }
    else
    {
        throw new InvalidOperationException("Unexpected result type");
    }

}
公共静态异步任务WriteResultsToStream(对象结果、流、取消令牌取消)
{
如果(结果==null)
{
回来
}
if(结果为AdomdDataReader rdr)
{
var encoding=new System.Text.UTF8Encoding(false);
使用(var tw=newstreamwriter(流,编码,1024*4,true))
使用(var w=newnewtonsoft.Json.JsonTextWriter(tw))
{
等待w.writeStartObject异步(取消);
var rn=“行”;
等待w.WritePropertyNameAsync(rn);
等待w.WriteStartarayAsync(取消);
while(rdr.Read())
{
等待w.writeStartObject异步(取消);
对于(int i=0;i