Dapper是什么?
Dapper是.net 一個簡單的對象映射,就速度而言,他是輕量數據 Orm 之王,他和Ado.net的DataReader一樣快。ORM是對象關系映射器,負責數據庫和編程語言之間的映射。
Dapper 繼承了IDbConnection,通過擴展數據庫查詢方法進行數據庫查詢
Dapper可與任何數據庫提供程序使用,沒有特定的數據庫實現。
Dapper怎樣工作?
主要分三個過程:
- 創建一個IDbConnection 對象
- 編寫CRUD操作語句
- 將操作語句作為參數,傳遞給Execute 方法
安裝
Dapper通過Negut進行安裝:https://www.nuget.org/packages/Dapper
PM> Install-Package Dapper
方法
dapper使用多種方法擴展IDbConnection接口
- Execute
- Query
- QueryFirst
- QueryFirstOrDefault
- QuerySingle
- QuerySingleOrDefault
- QueryMultiple
string sqlOrderDetails = "SELECT TOP 5 * FROM OrderDetails;"; string sqlOrderDetail = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;"; string sqlCustomerInsert = "INSERT INTO Customers (CustomerName) Values (@CustomerName);"; using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sqlOrderDetail, new {OrderDetailID = 1}); var affectedRows = connection.Execute(sqlCustomerInsert, new {CustomerName = "Mark"}); Console.WriteLine(orderDetails.Count); Console.WriteLine(affectedRows); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail }); }
參數
執行和查詢可以使用多種不同類型的參數
- Anonymous
- Dynamic
- List
- String
// Anonymous var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"}, commandType: CommandType.StoredProcedure); // Dynamic DynamicParameters parameter = new DynamicParameters(); parameter.Add("@Kind", InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input); parameter.Add("@Code", "Many_Insert_0", DbType.String, ParameterDirection.Input); parameter.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(sql, parameter, commandType: CommandType.StoredProcedure); int rowCount = parameter.Get<int>("@RowCount"); // List connection.Query<Invoice>(sql, new {Kind = new[] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList(); // String connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1", IsFixedLength = false, Length = 9, IsAnsi = true}}).ToList();
結果
查詢方法返回的結果可以映射為不同類型
- Anonymous
- Strongly Typed
- Multi-Mapping
- Multi-Result
- Multi-Type
string sqlOrderDetails = "SELECT TOP 10 * FROM OrderDetails;"; using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools())) { var anonymousList = connection.Query(sqlOrderDetails).ToList(); var orderDetails = connection.Query<OrderDetail>(sqlOrderDetails).ToList(); Console.WriteLine(anonymousList.Count); Console.WriteLine(orderDetails.Count); FiddleHelper.WriteTable(orderDetails); FiddleHelper.WriteTable(connection.Query(sqlOrderDetails).FirstOrDefault()); }
實用工具
- Async
- Buffered
- Transaction
- Stored Procedure
// Async connection.QueryAsync<Invoice>(sql) // Buffered connection.Query<Invoice>(sql, buffered: false) // Transaction using (var transaction = connection.BeginTransaction()) { var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"}, commandType: CommandType.StoredProcedure, transaction: transaction); transaction.Commit(); } // Stored Procedure var affectedRows = connection.Execute(sql, new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"}, commandType: CommandType.StoredProcedure);