1
resposta

Entender ThenInclude

Gostaria de Entender Melhor o uso do ThenInclude. Pelo que percebi este funciona como se tivesse feito um join com o resultado anterior, seria isso mesmo? Como seria a mesma construção para um left e right join usando o mesmo princípio?

1 resposta

Fala, Thiago, bom dia. Vamos por partes.

ThenInclude

O ThenInclude() é utilizado quando é necessário fazer um join em segundo nível de relacionamento (com o resultado anterior, conforme você escreveu).

Veja o exemplo abaixo onde precisamos recuperar dados de três entidades relacionadas, Artigo, Tag e sua classe de join TagArtigo.

var artigos = contexto.Artigos
  .Include(a = > a.TagsArtigo)
  .ThenInclude(ta => ta.Tag);

Para as declarações das entidades abaixo:

public class Artigo
{
  public int Id { get; set; }
  public string Titulo { get; set; }
  public IEnumerable<TagArtigo> TagsArtigo { get; set; }
}

public class TagArtigo
{
  public int Id { get; set; }
  public Artigo Artigo { get; set; }
  public Tag Tag { get; set; }
}

public class Tag
{
  public int Id { get; set; }
  public string Descricao { get; set; }
  public IEnumerable<TagArtigo> TagsArtigo { get; set; }
}

Left Join

A definição de usar o Left Join ou Inner Join vai depender se o EF Core entender que a propriedade de navegação é opcional ou não. Se for opcional, ele usará Left Join. Caso contrário, Inner.

Discuto essa questão nesse vídeo do meu curso sobre EF Core.

Você pode encontrar mais detalhes nesse comentário (em inglês) de uma issue no Github do repositório do EF Core.

Right Join

Se você precisar usar o right join em seu select precisará sair do conforto do EF Core e escrever o SQL na unha usando o método FromSql(). Mas lembre-se que o right join é o inverso do left join e talvez consiga gerar o SQL com o EF Core repensando sua consulta.

Espero ter ajudado!