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