You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A consulta so é executada quando chama o ToList();
Podendo ser chamado na variavel ou na consulta
( ... ).ToList(); ou query.ToList();
O retorno dela pode ser List
Ou object quando o select retornar um objeto,
from person in model
join address in _context.Addresses
on person.id equals address.cod_person
join curso in _context.Cursos
on person.id equals curso.cod_person into course
from curso in course.DefaultIfEmpty()
where address.rua == "Av Mario Werneck"
|| address.numero == 200
orderby person.nome descending
select new {
person.id,
person.nome,
person.genero,
address.cidade,
address.bairro,
address.numero,
Curso = curso.curso == null
? "Não possui curso superior"
: curso.curso
};
Tabela
Para a utilização de uma tabela tanto no From como no Join ela ter que possuir sua classe ( Model )
Para facilitar declare ela na sua classe contexto MySqlContext e utilize ela atravez do _context.Addresses
public class MySqlContext : DbContext
{
public MySqlContext(DbContextOptions<MySqlContext> options) : base(options) {}
public DbSet<Person> Persons { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<Curso> Cursos { get; set; }
}
From
Person vai ser o nome da classe model que é a classe da tabela
from person in model
Join
A tabela que vai dar o join tem que ter uma classe pronta
Sempre comece o ON pela coluna da tabela do from (from person)
join address in _context.Addresses
on person.id equals address.cod_person
Join com multiplas colunas ( tabela com chave composta )
join address in _context.Addresses
on new { person.id , person.field2 }
equals new { address.cod_person , address.field2 }
Left Join
Caso nao tenha resultado ele pega os valores padrao
join address in _context.Addresses
on person.id equals address.cod_person into Endereco
from address in Endereco.DefaultIfEmpty()
Caso não exista voce seta um valor padrao
select new {
person.nome,
Address = subaddress?.cidade ?? String.Empty
};
Where
Pode ser comparada com qualquer coisa
where person.id == id
And Where
Do segundo where para frente entra como and
where address.rua == "Av Mario Werneck"
where address.numero == 1200
Or Where
Usa o operador " || " que significa or
Mesma coisa que uma condicao if
where address.rua == "Av Mario Werneck" || address.numero == 1000
Where In
declare um array com o mesmo tipo da coluna
dentro do Contains vai a coluna da tabela
long[] Atencoes = new long[] { 2, 4, 6 };
where Atencoes.Contains(atencao.cod_atencao)
Where like
Use o metodo Contains que verifica caracteres dentro de uma string
Mesmo caso do Case acima, porem tem que fazer encadiamento de if ternario
Execute
Para executar uma funçao criada no banco ( procedure, function )
var status = _context.Database.ExecuteSqlRaw("EXECUTE dbvestib.inscricao_status_processo");
OrderBy
orderby person.nome descending //ascending
Select
Para selecionar apenas um objeto completo
select person
Para selecionar os dois objetos completo
Nesse caso ele cria mais uma variavel no objeto de retorno
select new { person, address }
data = {
person = { ... },
address = { ... }
}
Para selecionar apenas as colunas nescessarias
select new {
person.id,
person.nome,
address.cidade,
address.bairro
}
Para dar um nome customizado aos parametros
select new {
cod = person.id,
name = person.nome,
city = address.cidade,
neighborhood = address.bairro
}
Injecao de variavel no select da consulta
Para os casos de executar uma função do banco dentro do select,
string status = "ativo";
select new {
person.id,
person.nome,
address.bairro,
address.numero,
Curso = curso.curso == null
? "Não possui curso superior"
: curso.curso,
status
}).ToList();
HasMany
select new
{
atencao,
inscricoes = (
from insc in _context.Inscricoes
where insc.cod_atencao == atencao.cod_atencao
select insc.nome).ToList()
}).ToList();
Relacionamentos
1 - 1
Declare uma propriedade com a FK na model que foi criado a FK
public long cod_atencao { get; set; }
Declare qual a propriedade referente a essa chave
[ForeignKey("Atencao")]
Declare uma propriedade do tipo Model da outra tabela
public Atencao Atencao { get; set; }
Resultado final
[ForeignKey("Atencao")]
public long cod_atencao { get; set; }
public Atencao Atencao { get; set; }
1 - N
Declare uma propriedade com a FK
public long cod_insc { get; set; }
Declare qual a propriedade referente a essa chave
[ForeignKey("Inscricao")]
Declare uma propriedade do tipo Model da outra tabela
Use List<> ou ICollection<> para indicar que é uma lista
public List<Inscricao> Inscricao { get; set; }
Resultado final
[ForeignKey("Inscricao")]
public long cod_insc { get; set; }
public List<Inscricao> Inscricao { get; set; }
N - N
Declare a FK de cada tabela
public long cod_serie { get; set; }
public long cod_disciplina { get; set; }
Declare qual a propriedade referente a essa chave
[ForeignKey("Serie")]
[ForeignKey("Disciplina")]
Declare uma propriedade do tipo Model da outra tabela
Use List<> ou ICollection<> para indicar que é uma lista
public List<Serie> Serie { get; set; }
public List<Disciplina> Disciplina { get; set; }
Resultado final
[ForeignKey("Serie")]
public long cod_serie { get; set; }
[ForeignKey("Disciplina")]
public long cod_disciplina { get; set; }
public List<Serie> Serie { get; set; }
public List<Disciplina> Disciplina { get; set; }
Observação
Para usar o relacionamento precisa chamar a propriedade
Remove o join que iria ser feito
from atencao in _context.Atencoes
select new {
atencao.Inscricao
}
Request
Query params
Deve informar o tipo de request aceito, o objeto com as colunas, e a variavel
[FromQuery] permite enviar parametros pela url
AlunoDisciplinaRequestGet é uma classe customizada com apénas os campos aceitos
public object Notas([FromQuery] AlunoDisciplinaRequestGet request)
Body
Pode ou não informar o tipo do request aceito, o objeto com as colunas e a variavel
O request tem que obedecer as colunas que estão na classe passada
[FromBody] permite enviar parametros pelo body
AlunoDisciplinaRequestPost é uma classe customizada com apenas os campos aceitos
public object Post([FromBody] AlunoDisciplinaRequestPost request)
Route
A sequencia deve ser a mesma passada nos parametros da função
O nome também tem que ser o mesmo
Pode passar na rota o tipo aceito
[HttpGet("aluno/{codaluno}/bimestre/{codbimestre}/notas")]
public object Notas(long codaluno, long codbimestre)
Observação
Os exemplos foram feitos com uma classe request customizada mas pode ser feito com a propria model
A vantagem da classe request customizada é poder selecionar apenas o que é preciso
public object Post([FromBody] AlunoDisciplina request)