Left join usando Entity Framework

image

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.