УДИВИТЕЛЬНЫЙ ВСТАВИТЬ / ОБНОВИТЬ CamelCase в Snake_Case для модели 70+ свойств - PullRequest
0 голосов
/ 29 марта 2019

Проблема в том, что в SQL есть хранимая процедура со столбцами snake_case, а на стороне c # у меня есть модель с ~ 70 + столбцами и именами свойств CamelCase.

  public void EditProfileSettings(ProfileSettingsEdit profileSettings)
    {
        using (SqlConnection sqlConnection = InitializeSqlConnection(_config.DataExportApplication))
        {
            DefaultTypeMap.MatchNamesWithUnderscores = true;

            sqlConnection.Query<ProfileSettingsEdit>(
               "usp_profilesettings_update",
               profileSettings,
               commandType: CommandType.StoredProcedure);
        }
    }

Я знаю, что это может быть дубликат, но ничего похожегоЯ нашел сработавшим для меня .. Я считаю, что пользовательские картографы могут решить эту проблему, но возможно ли это решить без написания правила для каждого свойства.?

Быстрое решение:

Ну, пока я могу с этим смириться:

public void EditProfileSettings(ProfileSettingsEdit profileSettings)
    {
        using (SqlConnection sqlConnection = InitializeSqlConnection(_config.DataExportApplication))
        {
            var parameters = new DynamicParameters();
            var props = profileSettings.GetType().GetProperties();

            for (int i = 0; i < props.Length; i++)
            {
                parameters.Add(props[i].Name.ToUnderscoreCase(), props[i].GetValue(profileSettings));
            }

            sqlConnection.Query<ProfileSettingsEdit>(
               "usp_profilesettings_update",
               parameters,
               commandType: CommandType.StoredProcedure);
        }
    }

 public static class ExtensionMethods
{
    public static string ToUnderscoreCase(this string str)
    {
        return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower();
    }
}

Не уверен, насколько быстрым будет быстродействие ... но если кто-то может прийтичто-нибудь получше, пожалуйста, не стесняйтесь мне помочь

1 Ответ

0 голосов
/ 29 марта 2019

Вы должны быть в состоянии сделать что-то вроде этого:

var map = new CustomPropertyTypeMap(typeof(ProfileSettingsEdit), 
    (type, columName) => new Func<Type, string, propertyInfo>(
        {
            return type.GetProperty(columnName).ToUnderscoreCase();
        }
    ));

А потом

SqlMapper.SetTypeMap(typeof(ProfileSettingsEdit), map);

Я подозреваю, что однократная установка карты типов более производительна, чем запуск кода при каждом выполнении.

Это напечатано на макушке, так что остерегайтесь синтаксических ошибок.

...