[Dapper]查詢結果欄位名稱是.net的特殊字元,無法對應問題

 近日在使用Dapper的時候遇到一個問題,就是預存程序的查詢結果欄位名稱內包含「()-#」等.net model無法作為屬性名稱的特殊字元,導致查詢結果無法Mapper,在網上查詢到的解決方法是利用「CustomPropertyTypeMap」與在model需特殊對應的屬性名稱上加[Desctiption("")]來解決。

解決方法:

*假設今日我們有一個SP [TESTSP] 執行後的結果 欄位名稱是 {"行政區","貨車-星期"}


1.建立 一個DapperHelper 建立 CustomMapQuery(),GetDescriptionFromAttribute() function


/// 客製化 Map Query
public static IEnumerable CustomMapQuery(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();

留言

這個網誌中的熱門文章

[Visual Studio]位於網際網路或是限制區域上 或是檔案上標有 web 字樣 所以無法處理該檔案。若希望處理這些檔案 請移除 web 字樣。

[IIS] IIS執行時,發生拒絕存取路徑 問題

[SourceTree]修改使用者帳號密碼