Dapper 插入/更新驼峰案例以Snake_Case 70+ 属性模型



问题是,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();
    }
}

不知道它会有多渴望性能......但如果有人能想出更好的东西,请随时帮助我

你应该能够做这样的事情:

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

然后

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

我怀疑设置一次类型映射比每次执行时运行代码的性能更高。

这是从我的头顶上键入的,所以要注意语法错误。

最新更新