Theme:
Fazer INNER JOIN usando LINQ
Como eu faço um INNER JOIN using LINQ com C#?
Answers
Olá pessoal, meu nome é Mauricio Junior e hoje eu vou mostrar como fazer um INNER JOIN com LINQ dentro da camada de repositório do app que eu fiz recentemente chamado plataforma.academy como caso real.
- Ferramenta: Visual Studio ou Rider
- Código: C#
- Plataforma: .NET 8 or 9
- Database: SQL Server
- Usando LINQ
O problema que tenho era que eu precisava juntar pelo menos 3 tabelas diferentes vinculadas pela chave primária e chave secundária juntando com a condição que o usuário pagou pelo curso dentro do app.
Para solucionar isso, eu preciso fazer um LINQ e que retorne os dados de forma IEnumerable sem que bloqueie nenhum tracking.
Vou para a solução, veja o código 1.1
1 public IEnumerable MyMethod(int videoId, int userId)
2 {
3 try
4 {
5 return
6 (
7 from c in _db.CourseModels
8 join cu in _db.CourseUserModels
9 on c.CourseId equals cu.CourseId
10 join vi in _db.VideoModels
11 on c.CourseId equals vi.CourseId
12 where
13 cu.UserId == userId &&
14 vi.VideoId == videoId &&
15 cu.Status == 1 //pago pelo usuario
16 select new
17 {
18 //...fields that I need
19 }
20 )
21 .AsNoTracking()
22 .ToList();
23 }
24 catch (Exception ex)
25 {
26 _logger.LogError("Method: {Name} - Exception: {ExMessage} - {Now}", MethodBase.GetCurrentMethod()!.Name, ex.Message, DateTime.Now);
27 throw;
28 }
29 }
Código 1.1 - Fazendo LINQ
Eu comecei com o return (linha 5) mas é bom colocar uma variável como var result e assim fica mais fácil de usar o auto-complete da ferramenta de código.
Logo em seguida eu coloquei o from da tabela principal e depois fui adicionando as outras tabelas com o join (linha 8) e o on (linha 9) é para juntar a chave primária com a chave secundária. Depois adicionei a outra tabela (linha 10) com o comando join e as chaves (linha 11).
Para colocar as condições, foram necessários utilizar o comando where para respeitar a parte do usuário e o id do vídeo. Como no meu caso eu quero sempre buscar pelo id do usuário e o id do vídeo, precico vincular sempre o valor que passei usando campo == id para o usuário e vídeo (linha 13 e 14).
Para finalizar o select coloquei os campos que eu precisava e o .AsNoTracking() com o .ToList() para retornar a lista para o método que chamou na camada acima, de serviço.
Assim eu finalizo aqui e espero que tenham gostado de mais um exemplo real. Qualquer dúvida pode entrar em contato comigo pelos sites www.mauriciojunior.net e plataforma.academy para mais informações.
Abraços.
Wednesday, November 27, 2024
Mauricio Junior
Wednesday, November 27, 2024
Mauricio Junior