[Dapper]查詢結果欄位名稱是.net的特殊字元,無法對應問題
近日在使用Dapper的時候遇到一個問題,就是預存程序的查詢結果欄位名稱內包含「()-#」等.net model無法作為屬性名稱的特殊字元,導致查詢結果無法Mapper,在網上查詢到的解決方法是利用「CustomPropertyTypeMap」與在model需特殊對應的屬性名稱上加[Desctiption("")]來解決。
解決方法:
*假設今日我們有一個SP [TESTSP] 執行後的結果 欄位名稱是 {"行政區","貨車-星期"}
1.建立 一個DapperHelper 建立 CustomMapQuery(),GetDescriptionFromAttribute() function
/// 客製化 Map Query public static IEnumerableCustomMapQuery (string sql, object search) { using (var conn = new SqlConnection(_connectString)) { var map = new CustomPropertyTypeMap(typeof(TRsult), (type, columnName) => type.GetProperties().FirstOrDefault(prop => SqlHelper.GetDescriptionFromAttribute(prop) == columnName.ToLower())); SqlMapper.SetTypeMap(typeof(TRsult), map); var result = conn.Query (sql, search); return result; } } /// 取得模型 Description public static string GetDescriptionFromAttribute(MemberInfo member) { if (member == null) return null; var attrib = (DescriptionAttribute)Attribute.GetCustomAttribute(member, typeof(DescriptionAttribute), false); return (attrib?.Description ?? member.Name).ToLower(); }
2.建立對應模型
/// 測試-模型 public class TestModel { public string 行政區 { get; set; } [Description("貨車-星期")] public string 貨車_星期 { get; set; } }
3.執行查詢
var sql = "exec [TESTSP] "; var list = DapperHelper.CustomMapQuery(sql, search).ToList();
留言
張貼留言