Я хочу выполнять команды динамического SQL с динамическими соединениями и динамическими моделями вывода в EF Core 2. В настоящее время я использую традиционный SqlCommand
, который, на мой взгляд, не является лучшим решением из-за низкой производительности при десериализации динамических данных. Я ценю любые улучшения или другие решения.
using (SqlConnection Connection = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(command, Connection))
{
cmd.Parameters.AddRange(parameters);
if (commandTimeOut > 0) cmd.CommandTimeout = commandTimeOut;
if (Connection.State != ConnectionState.Open) Connection.Open();
var dr = await cmd.ExecuteReaderAsync();
var _setting = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var result = JsonConvert.DeserializeObject(dr.ToJson(), _setting);
Connection.Close();
return result;
}
Метод ToJson:
public static string ToJson(this SqlDataReader rdr)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonTextWriter jsonWriter = new JsonTextWriter(sw))
{
jsonWriter.QuoteChar = '\'';
jsonWriter.WriteStartArray();
while (rdr.Read())
{
jsonWriter.WriteStartObject();
int fields = rdr.FieldCount;
for (int i = 0; i < fields; i++)
{
jsonWriter.WritePropertyName(rdr.GetName(i));
var value = rdr.GetValue(i);
var valueF = value.GetType() == typeof(long) ? value?.ToString() : value;
jsonWriter.WriteValue(valueF);
}
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
return sw.ToString();
}
}