Left join usando Entity Framework
Olá leitor(a) meu nome é Mauricio Junior e hoje eu vou falar e mostrar como fazer um select usando Entity Framework e nele terá o famoso Left Join com o framework da Microsoft.
Aqui eu vou mostrar um método que fiz e nele eu vou fazer 3 inner joins e 1 left join. Lembro que aqui eu não vou mostrar como fazer a conexão com o banco de dados, só vou mostrar como fazer o left join usando o Entity Framework com .NETCore.
O framework gosta de usar muito alias para os nomes das tabelas, então baseado nisso, tome cuidado para não colocar qualquer nome e depois ficar perdido nos relacionamentos e nomes de campos. Eu costume usar um padrão de primeira letra da tabela e quando a tabela tem mais nomes, usar a primeira letra de cada nome; por exemplo: Member_Education eu vou usar me como alias.
O código 1.1 mostra como fiz toda a busca no banco de dados.
Código 1.1 - GetMember Education
public IList GetMemberEducation(int memberId)
{
try
{
var result =
(
from me in _db.Member_Education_Level
join rel in _db.Ref_Education_Level
on me.Education_Level_Code equals rel.Education_Level_Code
join m in _db.Member
on me.Member_Id equals m.Member_Id
join p in _db.Person
on m.Person_Id equals p.Id
join a in _db.Association
on me.Entered_By_Association_Id equals a.Association_Id into ea1
from ar in ar1.DefaultIfEmpty() //left join
where me.Member_Id == memberId
select new
{
me.Id,
MemberId = me.Member_Id,
EnteredByAssociationId = me.Entered_By_Association_Id,
EnteredByAssociationName = ar.Association_Name,
EducationLevelCode = me.Education_Level_Code,
EducationLevelDescription = rel.Education_Level_Description,
TimeStampSeq = me.Timestamp_Seq,
FirstInsertedBy = me.First_Inserted_By,
FirstInsertedDateTime = me.First_Inserted_Datetime,
LastChangedBy = me.Last_Changed_By,
LastChangedDateTime = me.Last_Changed_Datetime,
SourceSystemId = me.Source_System_Id,
SourceMethodId = me.Source_Method_Id
}
).ToList();
return result;
}
catch (Exception ex)
{
_logger.LogError($"Method: {MethodBase.GetCurrentMethod().Name} - Exception: {ex.Message} - {DateTime.Now}");
throw ex;
}
}
O primeiro passo do código é ver que o retorno é uma List ou melhor, uma interface de uma lista genérica.
Depois disso eu coloquei o bloco de try e catch para pegar algum erro se acontecer, até porque nunca se sabe.
O começo é a atribuição de todo select para variável result começando do from me (alias) com a tabela principal Member_Education_Level. O primeiro join é o inner join comum que relaciona as duas tabelas por uma chave comum entre elas. O segundo join com a tabela Member é também o relacionamento usando uma chave da tabela principal com a Member. O terceiro join é o relacionamento de Member com a tabela Person usando a chave Id entre elas.
Já o quarto join faz o relacionamento da tabela Member_Education_Level com a tabela de Association usando Association_Id como chave porém eu fiz uma atribuição usando into e from com o commando DefaultIfEmpty() que significa o seguinte: se não tiver nenhuma associação pelo campo chave, ou seja, nenhum valor relacionado entre as duas tabelas, não vai trazer nenhuma linha a mais. O resultado será o mesmo quando você faz o left join, mas o segredo aqui é o DefaultIfEmpty().
Depois disso adicionei a condição where me.Member_Id == memberId (parâmetro enviado) e para finalizar o select usei o comando select new { com os campos } que eu preciso retornar dentro da lista.
Depois do select chamei a opção .ToList() que transforma tudo na lista necessária para retorno.
Para finalizar o método, basta fazer o return result; com todos os dados retornados do select.
Eu fico por aqui e espero que tenha entendido. Qualquer dúvida pode entrar em contato comigo pelo Instagram @mauriciojunior_net ou pelo meu site www.mauriciojunior.net.