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> 來做 就沒問題了...