C# Dapper - Come creare istruzioni select, insert, update ed delete

C# Dapper - Come creare istruzioni select, insert, update ed delete

Dapper semplifica "Esegui una query e mappa i risultati, se presenti, su un elenco fortemente tipizzato". Questo post mostra come eseguire select, inserire, aggiornare ed eliminare istruzioni con Dapper.

  • Tabella di esempio e classe
  • Inserisci esempio
  • Seleziona esempio
  • Esempio di aggiornamento
  • Elimina esempio

Tabella e classe di esempio

Per questo post utilizzeremo la seguente tabella:

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

In quella sopra c'è una tabella con un semplice int colonna identità e un nvarchar colonna per un testo. Un'immagine di questo da SQL Management Studio può essere vista di seguito:

Non importa la tabella EFMigrationsHistory, ho riutilizzato questo database da un precedente post sul blog :)

Useremo la seguente classe di corrispondenza per la tabella:

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

Ha un nome diverso dalla tabella perché mi piace che le classi siano singolari, affinché funzioni dobbiamo aggiungere il Table annotazione. A parte questo, le sue proprietà corrispondono alle colonne della tabella.

Inserisci

Possiamo usare il metodo Execute direttamente su una connessione SQL per inserire una riga:

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" });
}

In quanto sopra apriamo una connessione al database utilizzando uno standard SqlConnection. Quindi forniamo un'istruzione di inserimento SQL insieme all'entità che vogliamo inserire nel Execute metodo. Il metodo execute restituisce il numero di righe interessate, non l'identità della riga appena creata. Tuttavia puoi ottenerlo usando il output clausola nella tua istruzione SQL quanto segue:

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" });
}

Utilizzo di Dapper.Contrib

È possibile utilizzare il pacchetto nuget Dapper.Contrib per semplificare ulteriormente quanto sopra. L'esempio precedente può essere ridotto al seguente 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 non devi scrivere alcun SQL, lo mapperà da solo. Ottenere l'identità è anche integrato nell'istruzione Insert.


Seleziona

Puoi fare una semplice query in Dapper usando uno dei tanti metodi di estensione sulla connessione. Di seguito è riportato un esempio di come utilizzare il Query metodo:

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 });
}

In quanto sopra restituiamo un elenco di MyEntities mappate sulla nostra classe MyEntity . Puoi anche selezionare un singolo record anziché un elenco di record:

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 });
}

Quanto sopra funziona come ti aspetteresti qualsiasi cosa chiamata Single to - fallisce se non viene restituito esattamente un record, mentre QueryFirstOrDefault restituisce la prima riga con una corrispondenza oppure il valore predefinito (null in questo 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 }); 
}

Aggiorna

L'esecuzione di un'istruzione di aggiornamento con Dapper è simile a un inserimento:

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"});
}

In quanto sopra aggiorniamo il testo dell'entità con id 1. Il codice è simile all'inserto, poiché ci richiede di scrivere la nostra dichiarazione di aggiornamento e quindi di fornire parametri di corrispondenza. Il metodo Execute restituisce il numero di righe interessate.

Utilizzo di Dapper.Contrib

È possibile utilizzare il pacchetto nuget Dapper.Contrib per semplificare quanto sopra. L'esempio precedente può essere ridotto al seguente 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" });
}

In quanto sopra non è necessario scrivere personalmente alcun SQL, ma fornire solo l'oggetto che si desidera aggiornare.


Elimina

L'esecuzione di un'istruzione di eliminazione con Dapper è simile a un inserimento e un aggiornamento:

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 });
}

In quanto sopra eliminiamo l'entità con id 1. Il codice è simile all'inserimento e all'aggiornamento, poiché richiede di scrivere la nostra istruzione sql e quindi fornire parametri di corrispondenza. Il metodo Execute restituisce il numero di righe interessate.

Utilizzo di Dapper.Contrib

È possibile utilizzare il pacchetto nuget Dapper.Contrib per semplificare quanto sopra. L'esempio precedente può essere ridotto al seguente 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 });
}

In quanto sopra non è necessario scrivere personalmente alcun SQL, ma fornire solo l'oggetto che si desidera eliminare.

Ecco fatto

Spero che questo post ti sia stato utile, se qualcosa non è chiaro o hai altri feedback, contattaci nei commenti in basso!