Last active
April 7, 2017 19:45
-
-
Save jean-lourenco/7f38212e1d2c3a3263a298e98afd50d0 to your computer and use it in GitHub Desktop.
Exemplo de queries com o Dapper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void Main() | |
{ | |
var paraCadastrar = new [] | |
{ | |
new { Chave = "CSVDEFAULT", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "JSONDEFAULT", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "YAML", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "INIT", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "CONFIG", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "BSON", Descricao = "Descrição detalhada (ou não)" }, | |
new { Chave = "HOCON", Descricao = "Descrição detalhada (ou não)" } | |
}; | |
var clienteParam = new { Nome = "John Hathorne", Cnpj = "12112638000101", DiretorioPadrao = "john-hathorne", Email = "john@hathorne.com", Telefone = "4796969696", TipoTransformacaoId = 42 }; | |
// Para cada operação no banco é preciso abrir uma conexão/sessão | |
// As classes Conexao e Sessao são classes helper que fiz para gerenciar melhor as conexões | |
using (var sessao = Conexao.Abrir().Sessao) | |
{ | |
// Não custa nada usar o 'using' para o dispose da transação ¯\_(ツ)_/¯ | |
using (var tran = sessao.BeginTransaction()) | |
{ | |
// Execute é uma extensão do Dapper para queries que não retornam valores | |
sessao.Execute( | |
"insert into TipoTransformacao (Chave, Descricao) values (@Chave, @Descricao)", | |
paraCadastrar, // Bulk-insert: paraCadastrar é uma lista, e é gerado um script de insert conforme os parâmetros dela | |
transaction: tran); // No Execute a transação precisa ser passada como parâmetro | |
// Query faz o que o nome diz, traduzindo a query para o tipo especificado | |
// Retorna um IEnumerable<T> | |
var tipos = sessao.Query<TipoTransformacao>(@" | |
select | |
Id, Chave, Descricao | |
from | |
TipoTransformacao"); | |
foreach (var tipo in tipos) | |
{ | |
Console.WriteLine($@" | |
Id: {tipo.Id} | |
Chave: {tipo.Chave} | |
Descricao: {tipo.Descricao}"); | |
} | |
// Inserção de elemento com retorno do objeto | |
// Também poderia apenas retornar o Id | |
var clienteInserido = sessao.Query<Cliente>( | |
@" insert into Cliente | |
(Nome, Cnpj, DiretorioPadrao, TipoTransformacaoPadraoId, Telefone, Email) | |
values | |
(@Nome, @Cnpj, @DiretorioPadrao, @TipoTransformacaoId, @Telefone, @Email) | |
select * from Cliente where Id = cast(SCOPE_IDENTITY() as int)", | |
clienteParam, | |
transaction: tran).Single(); | |
Console.WriteLine($"Cliente Inserido: ${clienteInserido.Id} ${clienteInserido.Id}"); | |
// Query com mapeamento de dependências. | |
// Neste caso, ao buscar a entidade Cliente, busca também o TipoTransformacao | |
// Os parâmetros genericos representam: 1 e 2 = Formato das entidades do Join 3 = Retorno | |
var cliente = sessao.Query<Cliente, TipoTransformacao, Cliente>($@" | |
select | |
Nome, Cnpj, DiretorioPadrao, t.*, Telefone, Email | |
from | |
Cliente c | |
inner join TipoTransformacao t | |
on (c.TipoTransformacaoPadraoId = t.Id) | |
where | |
c.Id = {clienteInserido.Id}" | |
// aqui é informado o que deve ser feito com as duas entidades obtidas no join | |
// neste caso é acoplar o TipoTransformacao ao Cliente | |
, (c, tipo) => { c.TipoTransformacaoPadrao = tipo; return c; } | |
, transaction: tran) | |
.Single(); | |
Console.WriteLine($@" | |
Cliente.Nome: {cliente.Nome} | |
Cliente.Email: {cliente.Email} | |
Cliente.TipoTransformacao: {cliente.TipoTransformacaoPadrao.Chave} {cliente.TipoTransformacaoPadrao.Descricao}"); | |
tran.Rollback(); | |
} | |
} | |
Console.ReadKey(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Tirando esses asteriscos nas queries, tá bom 👍