C# Dapper:cómo hacer declaraciones de selección, inserción, actualización y eliminación

C# Dapper:cómo hacer declaraciones de selección, inserción, actualización y eliminación

Dapper facilita "Ejecutar una consulta y asignar los resultados, si los hay, a una lista fuertemente tipada". Esta publicación demuestra cómo ejecutar instrucciones de selección, inserción, actualización y eliminación con Dapper.

Enlaces rápidos

  • Tabla y clase de ejemplo
  • Insertar ejemplo
  • Seleccionar ejemplo
  • Ejemplo de actualización
  • Eliminar ejemplo

Ejemplo de tabla y clase

Para esta publicación utilizaremos la siguiente tabla:

CREATE TABLE [dbo].[MyEntities](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Text] [nvarchar](max) NOT NULL,
   CONSTRAINT [PK_MyEntities] PRIMARY KEY CLUSTERED 
   (
	  [Id] ASC
   )
)

En lo anterior hay una tabla con un simple int columna de identidad y un nvarchar columna de un texto. Una imagen de esto de SQL Management Studio se puede ver a continuación:

No importa la tabla EFMigrationsHistory, he reutilizado esta base de datos de una publicación de blog anterior :)

Usaremos la siguiente clase coincidente para la tabla:

[Table("MyEntities")]
public class MyEntity
{
    public int Id { get; set; }
    public string Text { get; set; }
}

Tiene un nombre diferente al de la tabla porque me gusta que las clases sean singulares, para que esto funcione necesitamos agregar el Table anotación. Aparte de eso, sus propiedades coinciden con las columnas de la tabla.

Insertar

Podemos usar el método Execute directamente en una conexión SQL para insertar una fila:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    sqlConnection.Execute("INSERT INTO [dbo].[MyEntities] (Text) VALUES (@Text);", new MyEntity { Text = "this is a text" });
}

En lo anterior, abrimos una conexión a la base de datos usando un SqlConnection estándar. Luego proporcionamos una declaración de inserción SQL junto con la entidad que queremos insertar en el Execute método. El método de ejecución devuelve el número de filas afectadas, no la identidad de la fila recién creada. Sin embargo, puede obtenerlo usando el output cláusula en su instrucción SQL lo siguiente:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var identity = sqlConnection.QuerySingle<int>("INSERT INTO [dbo].[MyEntities] (Text) output inserted.Id VALUES (@Text);"
        , new MyEntity { Text = "this is a text" });
}

Usando Dapper.Contrib

Puede usar el paquete nuget Dapper.Contrib para simplificar aún más lo anterior. El ejemplo anterior se puede reducir al siguiente con Dapper.Contrib:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var identity = sqlConnection.Insert(new MyEntity { Text = "this is a text" });
}

Con Dapper Contrib no tiene que escribir ningún SQL, lo mapeará por sí mismo. Obtener la identidad también está integrado en la instrucción Insertar.


Seleccionar

Puede realizar una consulta simple en Dapper utilizando uno de los muchos métodos de extensión en la conexión. A continuación se muestra un ejemplo de cómo utilizar el Query método:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
    var results = sqlConnection.Query<MyEntity>(sql, new { id = 1 });
}

En lo anterior, devolvemos una lista de MyEntities asignadas a nuestra clase MyEntity . También puede seleccionar un solo registro en lugar de una lista de registros:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
    var results = sqlConnection.Query<MyEntity>(sql, new { id = 1 });
}

Lo anterior funciona como cabría esperar de algo llamado Single to - falla si no se devuelve exactamente un registro, mientras que QueryFirstOrDefault devuelve la primera fila con una coincidencia o el valor predeterminado (nulo en este caso):

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    string sql = "SELECT id, text FROM [dbo].[MyEntities] WHERE id = @id";
    var results = sqlConnection.QueryFirstOrDefault<MyEntity>(sql, new { id = 1 }); 
}

Actualizar

Ejecutar una declaración de actualización con Dapper es similar a una inserción:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    string sql = "update [dbo].[MyEntities] set text = @text WHERE id = @id";
    var results = sqlConnection.Execute(sql, new MyEntity { Id = 1, Text = "this is another text"});
}

En lo anterior, actualizamos el texto de la entidad con id 1. El código es similar al inserto, ya que requiere que escribamos nuestra declaración de actualización y luego proporcionemos parámetros coincidentes. El método Execute devuelve el número de filas afectadas.

Usando Dapper.Contrib

Puede usar el paquete nuget Dapper.Contrib para simplificar lo anterior. El ejemplo anterior se puede reducir al siguiente con Dapper.Contrib:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var results = sqlConnection.Update(new MyEntity { Id = 2, Text = "this is another text" });
}

En lo anterior, no tiene que escribir ningún SQL usted mismo, sino solo proporcionar el objeto que desea actualizar.


Eliminar

Ejecutar una declaración de eliminación con Dapper es similar a insertar y actualizar:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    string sql = "delete from [dbo].[MyEntities] WHERE id = @id";
    var results = sqlConnection.Execute(sql, new MyEntity { Id = 1 });
}

En lo anterior, eliminamos la entidad con id 1. El código es similar a insertar y actualizar, ya que requiere que escribamos nuestra declaración sql y luego proporcionemos parámetros coincidentes. El método Execute devuelve el número de filas afectadas.

Usando Dapper.Contrib

Puede usar el paquete nuget Dapper.Contrib para simplificar lo anterior. El ejemplo anterior se puede reducir al siguiente con Dapper.Contrib:

using (var sqlConnection = new SqlConnection(@"Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"))
{
    var results = sqlConnection.Delete(new MyEntity { Id = 2 });
}

En lo anterior, no tiene que escribir ningún SQL usted mismo, solo proporcione el objeto que desea eliminar.

Eso es

Espero que esta publicación le haya resultado útil. Si algo no quedó claro o si tiene algún otro comentario, comuníquese con los comentarios a continuación.