Back
Theme:

Fazer INNER JOIN usando LINQ


Como eu faço um INNER JOIN using LINQ com C#?

Date: Wednesday, November 27, 2024
2 answers | 21 view(s)
by Mauricio Junior

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


25