Каков наилучший подход для выполнения команды SQL с динамическим соединением и динамическим выходным результатом в EF Core 2? - PullRequest
0 голосов
/ 26 мая 2019

Я хочу выполнять команды динамического 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();
        }
    }
...