[Dapper][.net mvc] Dapper Query Add Upper Column Value Null

https://blog.darkthread.net/blog/enum-columns-from-dapper-result/

今天大概是遇到了一樣的雷

其實不知道 為何Dapper 在Query 的判定上是怎麼判別的

但也因為這樣 寫篇文章提醒自己 以後Dapper 就用原本dynamic 的回傳就好了

遇到雷的流程大概就是

前端AJAX Post->Action->Service->Dal (GetGridData方法)

 public bool GetGridData(out IList<IDictionary<string,object>> data,string prjID)
        {
            data = null;
            string sqlCommand = @"
                                SELECT QRSeqNo,
                                       [dbo].[FN_GetUserName](QUserID) AS User_Name,
	                                   Status,
                                       CONVERT(varchar, QDate, 111) AS QDate,
                                       QComment,
                                       CONVERT(varchar, RDate, 111) AS RDate,
                                       Reply 
                                FROM dbReply
                                ";
            data = ExecuteQuery(sqlCommand, objParam);
            return data.Count > 0 ? true : false;
        }

在這邊用自己擴充的 IList<IDictionary<string,object>> 的ExecuteQuery 方法

        protected IList<IDictionary<string, object>> ExecuteQuery(string sql, object param = null)
        {
            IEnumerable<IDictionary<string, object>> result = null;

                    using (var conn = new GlimpseDbConnection(new SqlConnection(this.DbConnStr)))
                    {
                        result = conn.Query(sql, param) as IEnumerable<IDictionary<string, object>>;                        
                    }

            }
        }

在第一次照著這流程走的時候

Dapper 都正常,欄位(下圖),值也都是正常(就不再show圖)

但再照著同樣的 前方一樣的流程 (過程中沒有任何修改DB資料、欄位)

前端AJAX Post->Action->Service->Dal (GetGridData方法)

我們可以看到 最前面貼的文章
攔截所有 dynamic 形式的成員存取,只要遇到非欄位名稱就傳回 null,因此不只 GetType(),呼叫 AsEnumerable() 也會傳回 null
https://blog.darkthread.net/blog/enum-columns-from-dapper-result/

結論:我們還是不知道,為什麼Dapper 在第一次的時候可以正常Map到值,在第二次的時候也是有Map到值
但也有判定成Map不到,所以又再建立屬性、填入null ,由於我們會拿後續的result做其他 處理邏輯,所以這原本的7筆變成14筆就會有影響了。

最後解決方法就是,不要用 IList<IDictionary<string,obejct>>來做,就用原本的IList<T> ,List<dynamic> 來做 就沒問題了...