2015年9月29日 星期二

Dapper 練習題 - 每個查詢的結果都要定義並對映一個類別嗎?(使用 dynamic)

關於定義類別這件事,尤其是裝載資料的 Model 類別,在開發的過程中算是稀鬆平常的事情,但如果你的開發是習慣使用弱型別並且從頭到尾(從資料庫取得一直到資料顯示在頁面上)都使用弱型別,那麼建立 Model 類別的次數就會相對地比較少,因為會用到的情況比較少,但如果你已經試著在專案裡使用 Dapper 開發或是早已經使用 ADO.NET + T-SQL 然後自行處理資料對映到類別的操作,那一定會遇到一種情況會讓人相當猶豫不決,那就是查詢所取得的欄位數量不多時,實在是不想再去建立一個新的類別(因為建立的類別已經一堆了,再新建下去就搞不清楚了)。

Dapper 有提供查詢結果對映到 dynamic 型別,上述所遇到的狀況就能提供方便的處理,如此一來就不必每個查詢都需要建立一個新的類別,減少管理及維護上的困擾。

 


在使用 Dapper 進行一般的資料查詢操作,查詢的結果都會對映到一個已經事前定義好的類別,如下:

image

 

但如果現在只是需要取得其中兩個屬性的資料時呢?可以不必另外指定型別而是讓查詢結果對映到 dynamic,如下:

image

如果是要用迴圈的方式取出每一筆資料的各個欄位值,方式如下:

image

因為是 dynamic 型別,所以在 foreach 迴圈裡是無法用「點」方法將屬性 CustomerID 與 AccountNumber 給帶出來,

image

而且你還必須大小寫都打對,才能正確的將屬性值給顯示出來,

image

雖然在使用 Dapper 進行查詢時可以不必指定查詢後結果的對映資料型別而使用 dynamic 型別,但這麼一來就失去了強型別的好處,而且在設計期、編譯期都不會有錯誤出現(除非你有寫單元測試),不然就只有在執行期才能知道那邊寫錯了。

 

另一個小示範,將查詢結果轉成 Dictionary 型別,Key 為 CustomerID 而 Value 為 AccountNumber,如果沒有特別轉型的話, Dictionary 的 Key 和 Value 都會是 dynamic 型別。

image

換個方式操作

image

 


當你使用 Dapper 進行查詢處理時,如果你所回傳的資料是只有幾個欄位,而不想要另外建立自定義類別的時候,可以使用 Dapper 查詢結果對映 dynamic 型別的功能,如此一來就不會產生眾多只用來裝載查詢結果的自定義類別,不過在使用到要特別注意 dynamic 型別的特性,無法在設計期與編譯期顯示錯誤,只有在執行期才能知道錯誤,所以不要為了貪圖方便而將每個查詢結果都用 dynamic 型別,千萬不要因小失大,該做的還是要做。

 

延伸閱讀

短小精悍的.NET ORM神器 -- Dapper - 黑暗執行緒

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。

最近的留言