iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
3
Software Development

🌊 進階學習 ADO.NET、Dapper、Entity Framework 系列 第 25

【Entity Framework搭配Dapper】使用時機

以前常能在網路上看到EF VS Dapper類似以下文章 :
5年后,我们为什么要从 Entity Framework 转到 Dapper 工具?

似乎一定要選邊站的感覺,但程式其實只是一種實現邏輯工具,假如工具之間有配合加成的效果就不應該選擇其一,而是互取所長。

個人搭配使用方式 :

需求 優先使用技術
動態資料 Dapper
輕量 Dapper
增、刪、改 EF
簡單查詢 優先使用EF LINQ
必要一般sql查詢 優先使用EF.SqlQuery
複雜sql查詢情況 Dapper
執行效率 Dapper

EF DbContext為主 Dapper為輔開發方式

非常的簡單只需要記得自己EF類別.Database.Connection就可以(EF Core使用DbContext.Database.GetDbConnection())

void Main()
{
	using (var connection = new EfDbContext().Database.Connection)
	{
		var result = connection.QueryFirst("select 'hello world' ");
		Console.WriteLine(result);
	}
}

static string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=SSPI;Initial Catalog=tempdb;";
public class EfDbContext : DbContext
{
	public EfDbContext() : base(connectionString) { }
}

https://ithelp.ithome.com.tw/upload/images/20190928/201059889gSKk4DrNr.png

「動態需求」 使用Dapper

舉例 : 像是動態sql查詢動態生成Insert Sql

https://ithelp.ithome.com.tw/upload/images/20190928/20105988DU2926g9gF.png

public static class Generator
{
	public static string InsertSql(this IDbConnection connection, string sql,string tableName = "TempTable")
	{
		using (var reader = connection.ExecuteReader(sql))
		{
			var sb = new StringBuilder();
			do
			{
				if (reader.FieldCount <= 1) continue;

				var schema = reader.GetSchemaTable();
				var columnNames = schema.Rows.Cast<DataRow>().Select(row => (string)row["ColumnName"]);
				var perfixColumnNames = columnNames.Select(s => $"@{s}");

				sb.AppendFormat("insert into {0}",tableName);
				sb.Append("(");
				sb.Append(string.Join(",",columnNames));
				sb.Append(")");
				
				sb.Append(" values ");
				sb.Append("(");
				sb.Append(string.Join(",", perfixColumnNames));
				sb.Append(");");

			} while (reader.NextResult());

			return sb.ToString();
		}
	}
}

「輕量、支持多資料庫需求」使用Dapper

Dapper 只需要簡單封裝一下,就可以支援多個資料庫,但要注意要使用標準sql語法

像是我寫的一個小專案 DbSqlHelper: Mini/Easy RDBMS Sql and Connection Helper就是用此概念,只需要簡單替換各資料庫Connection類別,就可以快速轉換資料庫。

Db.AddConnection<SqlConnection>(connectionString);
using (var connection = Db.GetConnection()){}

Db.AddConnection<OracleConnection>(connectionString);
using (var connection = Db.GetConnection()){}

必要sql查詢情況,沒有效率、輕量、dynamic、複雜需求,優先使用EF.SqlQuery

	using (var db = new EfDbContext())
	{
		var result = db.Database.SqlQuery<你的類別>("SQL");
	}

上一篇
【深入Dapper.NET源碼】目錄、整合版
下一篇
【Entity Framework搭配Dapper】為何簡單動作優先使用EntityFramework
系列文
🌊 進階學習 ADO.NET、Dapper、Entity Framework 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言