C# Dapper-SQL中的Entity Framework

  • 3523
  • 0
  • C#
  • 2020-07-27

關於Dapper的介紹,其實多到可以算月經文了XD

不過剛好有機會使用到,所以就順著介紹一下。

Dapper是一個輕量型的ORM工具,著重在效能與速度,所以他也只有一個Dll檔而已

非常輕量。

有興趣的讀者們可以到GitHub上看一下SouceCode,都是公開的。

 

 

雖然耳聞Dapper這個神器很久了,只是由於筆者是EF派的,所以已經很少會接觸到純下SQL的部分。

不過最近,筆者剛好需要撰寫SQL Command,於是又重新投入 DataReader、DataSet、DataTable的懷抱。

只是在使用的過程中,由於不想要讓程式碼看起來太過骯髒,於是在上層多包了一層父類來減少重複的程式碼

不過在撰寫查詢的時候卻發現到一個問題:

以下由DataReader做一個簡單的示範。

片段程式碼:

// 設定相關資料庫連線參數
String connection = System.Configuration.ConfigurationManager.ConnectionStrings["OrderDB"].ConnectionString;
protected SqlConnection sc = new SqlConnection(connection);
protected SqlCommand sqlcommand = new SqlCommand();
String sql = "select Student_Id,Student_Name from Student";

sqlcommand.Connection = sc;
// 開啟連線
sc.Open();
SqlCommand command = new SqlCommand(sql,connection);
// 讀取資料
SqlDataReader reader = command.ExecuteReader();

while (reader.Read())
 {
   Console.WriteLine("StudentId: {0}, StudentName: {1}", reader["Student_Id"],reader["Student_Name"]);
 }


由於已經習慣寫EF的我,對於這樣的操作方式會覺得顯得不夠直觀。

明明已經在Select當中定義了要讀取哪些欄位,但是在最後DataReader的時候,還是需要再次手動撈取欄位

假設如果要塞到自定義的List中,還需要一個一個把欄位給放進去。

於是開始思考,該怎麼做才能最快解決這個問題。

後來研究了許久,還是決定投入EF的懷抱,即使是透過SQL Command的方式。

Dapper的使用方式相當簡單:

首先在NuGet當中先安裝Dapper工具

接著就可以直接撰寫啦!

Dapper主要是透過 Extension Method 來擴充 SqlConnection的類別

因此當你在最上層 using了 Dapper後

using Dapper;

你會發現SqlConnection多了以下東西:

主要是針對Query來去做擴充。

後來了解後發現原理其實很簡單

就是先取得泛型的類別,並透過for迴圈的方式,將每一個的欄位資料,Mapping到指定的類別當中,

最後再裝回List,結束。

object obj;
Type type = obj.GetType();
var ps = type.GetProperties();

而Dapper使用方法呢其實就是這樣子:

// 設定相關資料庫連線參數
String connection = System.Configuration.ConfigurationManager.ConnectionStrings["OrderDB"].ConnectionString;
protected SqlConnection sc = new SqlConnection(connection);
protected SqlCommand sqlcommand = new SqlCommand();
String sql = "select Student_Id,Student_Name from Student";

sqlcommand.Connection = sc;
// 開啟連線
sc.Open();
// 資料讀取
String sql = "select Student_Id,Student_Name from Student";
var result =  sc.Query<Student>(sql);

這裡使用泛型版本的 Query 方法,以便將查詢結果自動對應至先前定義好的 Student 物件的屬性。

如此一來就可以快速的取得資料了。

結果如下:

另外,Dapper本身也支援具名參數,主要是為了防止 sql injection

使用方法也相當的簡單:

String sql = "select Student_Id,Student_Name from Student where Student_Name=@Name";
var result =  sc.Query<Student>(sql,new { Name="Leo"});


 

以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教:)

有任何家教、案子 或技術相關問題 請都歡迎聯繫我

http://www.zhenghui.idv.tw/