Mapeando objetos com C# e Dapper

     Fala galera, o post de hoje é para tratar de um assunto de extrema importância e fonte eterna de perguntas para muitos desenvolvedores(eu incluso!), a escolha e o uso da biblioteca de mapeamento objeto relacional (ORM – Object-Relational logo c#Mapping) para seu projeto. Por definição um ORM é a técnica que você utilizará para converter um formato de dados em linguagem orientada a objetos, ou seja, como você vai transformar aquelas tabelas que criou no seu banco de dados favorito em classes/objetos para uso na linguagem que escolheu para sua aplicação. Conhecem o Dapper?!

diagrama relacao banco ORM

      No mercado existem centenas de opções conhecidas de ORM para os mais diversos bancos de dados e linguagem de programação, sendo os mais conhecidos o Hibernate/NHibernate , Java e .NET respectivamente, e o queridinho da Microsoft, o EntityFramework. A estrela de hoje é o micro-ORM open-source criado e utilizado pelo pessoal do Stackoverflow, o DotNet Dapper.

     Abaixo segue meu primeiro contato com o Dapper e como funciona a criação de estruturas de consulta, gravação, atualização e exclusão de dados.

Instalando o Dapper com Nuget


     A instalação é simples, acessar o gerenciador do Nuget(Manage Nuget Packages) no seu projeto, procura por Dapper na aba “Online”, até o momento que fiz este post a última versão é a 1.50.2 sw 22/07/2016. Feita a instalação, a dll irá aparecer nas referências do projeto e podemos começar.

tela visals tudio nuget dapper

Tela de gerenciamento de packages do Nuget.

Obs: ao rodar o Dapper instalado via nuget pode se deparar com um erro em “SqlMapper.cs”, neste caso recomendo baixar o projeto do github e adicionar manualmente os arquivos .cs direto no projeto de teste e compilar.

Criando um SELECT

     Inicialmente vamos fazer um select básico em uma tabela, instanciamos uma conexão com a declaração using que irá gerenciar a abertura e fechamento da mesma, passamos a query em string para o método Query() e imprimimos a quantidade de linhas resultantes. Simples né?

string conString = ConfigurationManager.ConnectionStrings["Conexao"]
.ConnectionString;

Console.WriteLine(" ===== Projeto Dapper =====");
Console.WriteLine();
using (SqlConnection con = new SqlConnection(conString))
{
   var rows = con.Query("select * from ESTOQUE.Campanha");
   Console.WriteLine("Número de campanhas: " + rows.Count());
}

Criando um SELECT com filtros

using (SqlConnection con = new SqlConnection(conString))
{
   var sql = @"select * from ESTOQUE.Campanha where idCampanha = @id";
   using (var multi = con.QueryMultiple(sql, new { id = 15042015 }))
   {
        var campanha = multi.Read<Campanha>().Single();
        Console.WriteLine("Nome da campanha: " + campanha.nmCampanha);
   }
}

Criando um UPDATE

 using (SqlConnection con = new SqlConnection(conString))
 {
    var comando = @"update ESTOQUE.Campanha Set nmCampanha = @novoNome Where        idCampanha = @idCampanha";
    con.Execute(comando, new
    {
        novoNome = "CampanhaTeste01",
        idCampanha = 15042015
    });
 }

Criando um INSERT

using (SqlConnection con = new SqlConnection(conString))
{
    var campanha = new Campanha()
    {
       nmCampanha = "Camp01",
       dtInicio = DateTime.Now,
       dtFim = DateTime.Now.AddMonths(2),
       tipo = 6
    };

    var id = con.Query(
       @" insert ESTOQUE.Campanha(nmCampanha, dtInicio, dtFim, tipo)
       values (@nmCampanha, @dtInicio, @dtFim, @tipo)
       select cast(SCOPE_IDENTITY() as int)
    ", campanha).First();
}

Criando um DELETE

using (SqlConnection con = new SqlConnection(conString))
 {
     var id = con.Execute("delete from ESTOQUE.Campanha where idCampanha = @id", new {    id = 15042030 });
 }

     Obviamente que acima não está todo o poder do Dapper, os exemplos acima são bem simples e não exigem muito em termos de performance, mas então a pergunta que fica é se o ORM é eficiente quando se depara com consultas complexa e um volume grande de dados. Veja na tabela seguinte um benchmark feito com relação a outros métodos de consulta:

Método Duração
Hand coded (using a SqlDataReader) 47ms
Dapper ExecuteMapperQuery 49ms
ServiceStack.OrmLite (QueryById) 50ms
PetaPoco 52ms
BLToolkit 80ms
SubSonic CodingHorror 107ms
NHibernate SQL 104ms
Linq 2 SQL ExecuteQuery 181ms
Entity framework ExecuteStoreQuery 631ms

Fonte: https://github.com/StackExchange/dapper-dot-net

     Veja que o Dapper se sai quase tão bem quanto uma consulta feita “na mão”, sem intermediários. Se você precisa de algo leve, rápido e fácil de usar, ao invés de usar o Entity Framework como normalmente faria, considere experimentar o Dapper para criar aquela “telinha” que o seu tio pediu.

3 comentários sobre “Mapeando objetos com C# e Dapper

  1. Pingback: [Dapper] Objetos Complexos – Dicas e tutoriais em .NET

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s