關於定義類別這件事,尤其是裝載資料的 Model 類別,在開發的過程中算是稀鬆平常的事情,但如果你的開發是習慣使用弱型別並且從頭到尾(從資料庫取得一直到資料顯示在頁面上)都使用弱型別,那麼建立 Model 類別的次數就會相對地比較少,因為會用到的情況比較少,但如果你已經試著在專案裡使用 Dapper 開發或是早已經使用 ADO.NET + T-SQL 然後自行處理資料對映到類別的操作,那一定會遇到一種情況會讓人相當猶豫不決,那就是查詢所取得的欄位數量不多時,實在是不想再去建立一個新的類別(因為建立的類別已經一堆了,再新建下去就搞不清楚了)。
Dapper 有提供查詢結果對映到 dynamic 型別,上述所遇到的狀況就能提供方便的處理,如此一來就不必每個查詢都需要建立一個新的類別,減少管理及維護上的困擾。
在使用 Dapper 進行一般的資料查詢操作,查詢的結果都會對映到一個已經事前定義好的類別,如下:
但如果現在只是需要取得其中兩個屬性的資料時呢?可以不必另外指定型別而是讓查詢結果對映到 dynamic,如下:
如果是要用迴圈的方式取出每一筆資料的各個欄位值,方式如下:
因為是 dynamic 型別,所以在 foreach 迴圈裡是無法用「點」方法將屬性 CustomerID 與 AccountNumber 給帶出來,
而且你還必須大小寫都打對,才能正確的將屬性值給顯示出來,
雖然在使用 Dapper 進行查詢時可以不必指定查詢後結果的對映資料型別而使用 dynamic 型別,但這麼一來就失去了強型別的好處,而且在設計期、編譯期都不會有錯誤出現(除非你有寫單元測試),不然就只有在執行期才能知道那邊寫錯了。
另一個小示範,將查詢結果轉成 Dictionary 型別,Key 為 CustomerID 而 Value 為 AccountNumber,如果沒有特別轉型的話, Dictionary 的 Key 和 Value 都會是 dynamic 型別。
換個方式操作
當你使用 Dapper 進行查詢處理時,如果你所回傳的資料是只有幾個欄位,而不想要另外建立自定義類別的時候,可以使用 Dapper 查詢結果對映 dynamic 型別的功能,如此一來就不會產生眾多只用來裝載查詢結果的自定義類別,不過在使用到要特別注意 dynamic 型別的特性,無法在設計期與編譯期顯示錯誤,只有在執行期才能知道錯誤,所以不要為了貪圖方便而將每個查詢結果都用 dynamic 型別,千萬不要因小失大,該做的還是要做。
延伸閱讀
短小精悍的.NET ORM神器 -- Dapper - 黑暗執行緒
以上
純粹是在寫興趣的,用寫程式、寫文章來抒解工作壓力