问题是,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);
我怀疑设置一次类型映射比每次执行时运行代码的性能更高。
这是从我的头顶上键入的,所以要注意语法错误。