Dapper – The Alternative ORM

Dapper is the best alternative for Entity Framework, and in many situations, it is better. In this article, I will explain to you why it’s my favorite ORM.

If you think that Dapper is not suitable for you, consider that Stack Overflow uses.

Dapper vs Entity Framework

The most significant difference between these two is that you write SQL queries instead of C# LINQ Code when using Dapper.

In my opinion, Entity Framework is good when you don’t rely too much on the database. If you perform complex LINQ queries, the SQL that is generated is not the best in performance.

On the other part, Dapper is just a helper library that executes your SQL scripts and maps the result to an object.

The most significant advantage of Entity Framework is that you don’t write SQL scripts, but let be honest: SQL is easier and better than LINQ.

When you have to join multiple tables and have some filters, it is much easier to write the SQL query instead of C# code.


In matters of performance, Dapper does a great job. It almost as fast as handed code.

I have a benchmark for some selects and inserts and this is the result:

Entity Framework792.8

Dapper Features

  1. Works with most types of databases. Dapper supports SQL Server, Azure Databases, MySQL, Oracle, PostgreSQL, SQLite, SQL Compact.
  2. Dapper has already a lot of helper methods inspired from Entity Framework, that can bring your data in a particular form: using IDbConnection conn = Connection; conn.Open(); var payment= await conn.QueryFirstOrDefaultAsync("SELECT TOP 1 FROM Payments;");
  3. It is almost as fast as hand coded data retrieval using the SqlCommand class. Entity Framework instead takes two more time to perform the same query.
  4. You can easily execute store procedures and map the result to a C# entity. var payments = await conn.QueryAsync<Payment>("dbo.GetPayments", new { Month = "November" }, commandType: CommandType.StoredProcedure);
  5. Dapper supports transactions using IDbConnection conn = Connection; conn.Open(); using var transaction = conn.BeginTransaction(); company.id = await conn.QuerySingleAsync<int>("dbo.AddCompany", new { Name = company.Name, company.Position, company.HasBankInfo }, commandType: CommandType.StoredProcedure); transaction.Commit();

When to use Dapper

My recommendation is to use Dapper instead of Entity Core whenever you interact with the database multiple times in the same operation.

For example, you have to select a row from a table, then you insert a new record in another table and update the information in another. In my opinion, this is the perfect scenario when you can use Dapper.

If you only insert data as it is, without any modification, and after that, you select it, then Entity Framework will do a great job for you.

Another reason for using Dapper is when you already have the database used in production. Entity Framework database first will give you headaches with errors that you don’t know what it means.

Also, if the database is already in production, it probably uses SQL procedures. So, you can use Dapper to call them and map the result to C# classes. Using Entity Core, you will have to write the C# code to query the database.

3 thoughts on “Dapper – The Alternative ORM”

Leave a Comment