以前常能在網路上看到EF VS Dapper類似以下文章 :
5年后,我们为什么要从 Entity Framework 转到 Dapper 工具?
似乎一定要選邊站的感覺,但程式其實只是一種實現邏輯工具
,假如工具之間有配合加成的效果就不應該選擇其一,而是互取所長。
需求 | 優先使用技術 |
---|---|
動態資料 | Dapper |
輕量 | Dapper |
增、刪、改 | EF |
簡單查詢 | 優先使用EF LINQ |
必要一般sql查詢 | 優先使用EF.SqlQuery |
複雜sql查詢情況 | Dapper |
執行效率 | 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) { }
}
舉例 : 像是動態sql查詢動態生成Insert Sql
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 只需要簡單封裝一下,就可以支援多個資料庫,但要注意要使用標準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()){}
using (var db = new EfDbContext())
{
var result = db.Database.SqlQuery<你的類別>("SQL");
}