Dapper en .Net

Dapper es un micro ORM (Object Relational Mapper) desarrollado por el equipo de Stack Overflow.
A diferencia de Entity Framework, no crea un modelo complejo ni gestiona el cambio de esquema, sino que se enfoca en mapear rápidamente el resultado de consultas SQL a objetos C#.

Su gran ventaja es el rendimiento: es casi tan rápido como usar SqlDataReader directamente, pero con una sintaxis mucho más simple.

Ventajas:

  • Rápido y ligero: muy cercano al rendimiento de ADO.NET puro.
  • Sencillo de usar: no necesita configuración compleja.
  • Compatible con cualquier base de datos que tenga un proveedor ADO.NET.
  • Mapeo directo de resultados a clases.

Desventajas:

  • No gestiona el modelo ni migraciones (a diferencia de EF Core).
  • Necesita escribir consultas SQL manualmente.
  • Menos seguro si no usas parámetros (riesgo de inyección SQL).

Ejemplo de instalación y uso:

1. Instalación

Crea un proyecto nuevo y agrega los paquetes:

dotnet new console -n DapperPostgresDemo
cd DapperPostgresDemo
dotnet add package Dapper
dotnet add package Npgsql

Aquí usamos Npgsql porque es el proveedor ADO.NET para PostgreSQL.


2. Base de datos de ejemplo

En PostgreSQL, crea una tabla:

CREATE TABLE empleados (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    cargo VARCHAR(50),
    salario NUMERIC(10,2)
);

INSERT INTO empleados (nombre, cargo, salario) VALUES
('Ana López', 'Desarrolladora', 2500),
('Carlos Pérez', 'Diseñador', 2000);
3. Código en C# con Dapper y PostgreSQL
using System;
using System.Data;
using Npgsql;
using Dapper;

class Program
{
    static void Main()
    {
        string connectionString = "Host=localhost;Database=miempresa;Username=postgres;Password=TuPassword";

        using IDbConnection db = new NpgsqlConnection(connectionString);

        // Consulta simple
        var empleados = db.Query<Empleado>("SELECT * FROM empleados");

        Console.WriteLine("Lista de empleados:");
        foreach (var emp in empleados)
        {
            Console.WriteLine($"{emp.Id} - {emp.Nombre} ({emp.Cargo}) - {emp.Salario:C}");
        }

        // Insertar con parámetros
        string insertSql = "INSERT INTO empleados (nombre, cargo, salario) VALUES (@Nombre, @Cargo, @Salario)";
        var nuevoEmpleado = new Empleado { Nombre = "María Torres", Cargo = "QA", Salario = 1800 };
        db.Execute(insertSql, nuevoEmpleado);

        Console.WriteLine("Empleado insertado correctamente.");
    }
}

// Clase que mapea la tabla
public class Empleado
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public string Cargo { get; set; }
    public decimal Salario { get; set; }
}

En Resumen

NpgsqlConnection es la clase para conectar a PostgreSQL.

Query<T> devuelve una lista de objetos mapeados desde el resultado de la consulta.

Execute se usa para sentencias INSERT, UPDATE, DELETE.

Parámetros como @Nombre evitan inyección SQL.

Puedes usar using para cerrar automáticamente la conexión.