Dapper INSERT / UPDATE CamelCase to Snake_Case for 70+ properties model

问题描述 投票:0回答:1

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

不确定性能会如何变得很糟糕......但如果有人能想出更好的东西,请随时帮助我

c# sql stored-procedures dapper
1个回答
0
投票

你应该可以做这样的事情:

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

然后

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.