Skip to content

Instantly share code, notes, and snippets.

@jean-lourenco
Last active April 7, 2017 19:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jean-lourenco/7f38212e1d2c3a3263a298e98afd50d0 to your computer and use it in GitHub Desktop.
Save jean-lourenco/7f38212e1d2c3a3263a298e98afd50d0 to your computer and use it in GitHub Desktop.
Exemplo de queries com o Dapper
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();
}
@johnnyasantoss
Copy link

Tirando esses asteriscos nas queries, tá bom 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment