EF Core 2.1 - SQL Join com LINQ - III
Neste artigo veremos como realizar consultas SQL Join com LINQ usando o Entity Framework Core 2.1. |
|
Continuando a segunda parte do artigo vamos aplicar agora as demais consultas SQL Join usando o LINQ com Entity Framework Core 2.0.
Vamos continuar a usar o projeto EFCore_Joins criado no primeiro artigo.
1 - Aplicando o Cross Join ou junção cruzada
Uma Cross Join ou junção cruzada também é conhecida como um produto cartesiano, e, faz a junção de duas sequências ou coleções para obter uma nova coleção onde cada par combinado esta representado. Usando LINQ para realizar um Cross Join podemos evitar o uso de laços foreach aninhados.
Essa associação não requer nenhuma condição na junção, mas o LINQ não permite o uso da palavra-chave "join" sem nenhuma condição.
Assim, temos que usar duas cláusulas from, uma para cada fonte da sequência ou coleção, para poder fazer uma junção cruzada, e a seguir usar a cláusula Select para fazer uma projeção do resultado.
|
|
|
A instrução SQL gerada pelo EF Core foi a seguinte :
SELECT [f].[FuncionarioNome] AS [Nome],
[f].[FuncionarioCargo] AS [Cargo], [s].[SetorNome] AS [Setor]
FROM [Funcionarios] AS [f]
CROSS JOIN [Setores] AS [s]
2 - Aplicando o Group Join ou junção agrupada
Podemos realizar um Group Join usando o operador GroupJoin que executa a mesma tarefa que o operador Join, exceto que GroupJoin retorna um resultado no grupo com base na chave de grupo especificada.
O
operador GroupJoin une duas seqüências com base na chave e agrupa o
resultado pela chave correspondente; em seguida, retorna a coleção de resultado
e chave agrupados. O GroupJoin requer os mesmos parâmetros que o Join.
|
|
|
A seguir temos consulta SQL gerada pelo EF Core:
SELECT [s].[SetorId],
[s].[SetorNome] AS [NomeSetor], [f].[FuncionarioId], [f].[FuncionarioCargo],
[f].[FuncionarioNome], [f].[SetorId]
FROM [Setores] AS [s]
LEFT JOIN [Funcionarios] AS [f] ON [s].[SetorId] = [f].[SetorId]
ORDER BY [s].[SetorId]
Geralmente na SQL, uma Group Join ou junção de grupo pode ser feita usando uma cláusula "Group by".
Assim temos ainda mais duas maneiras de fazer uma junção de grupo usando a LINQ.
1-) Usando a palavra-chave INTO
Na consulta vamos usar a cláusula join para associar os elementos das duas tabelas e usar a palavra chave Into e a seguir usar cláusula select para fazer uma projeção do resultado:
using EFCore_Joins.Models;
using System;
using System.Linq;
namespace EFCore_Joins
{
class Program
{
static void Main(string[] args)
{
using (var contexto = new AppDbContext())
{
var groupJoin = from s in contexto.Setores
join e in contexto.Funcionarios on s.SetorId equals e.SetorId into funci
select new
{
CodigoSetor = s.SetorId,
NomeSetor = s.SetorNome,
Funcionarios = funci
};
foreach (var resultado in groupJoin)
{
Console.WriteLine("Setor:" + resultado.CodigoSetor + " - " + resultado.NomeSetor);
if (resultado.Funcionarios != null && resultado.Funcionarios.Count() > 0)
{
Console.WriteLine("Nome\t\t\tCargo");
foreach (var funci in resultado.Funcionarios)
{
Console.WriteLine(funci.FuncionarioNome + "\t\t" + funci.FuncionarioCargo);
}
}
else
{
Console.WriteLine("Setor não tem funcionários.");
}
Console.WriteLine("");
}
}
Console.ReadLine();
}
}
}
|
|
A instrução SQL gerada pelo EF Core foi a seguinte :
SELECT [s].[SetorId] AS
[CodigoSetor], [s].[SetorNome] AS [NomeSetor], [e].[FuncionarioId],
[e].[FuncionarioCargo], [e].[FuncionarioNome], [e].[SetorId]
FROM [Setores] AS [s]
LEFT JOIN [Funcionarios] AS [e] ON [s].[SetorId] = [e].[SetorId]
ORDER BY [CodigoSetor]
2-) Usar uma subconsulta
using EFCore_Joins.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace EFCore_Joins
{
class Program
{
static void Main(string[] args)
{
using (var contexto = new AppDbContext())
{
var groupJoin = from s in contexto.Setores
select new
{
CodigoSetor = s.SetorId,
NomeSetor = s.SetorNome,
Funcionarios = (from f in contexto.Funcionarios
where f.SetorId == s.SetorId
select f)
};
foreach (var resultado in groupJoin)
{
Console.WriteLine("Setor: " + resultado.CodigoSetor + " - " + resultado.NomeSetor);
var funcionarios = resultado.Funcionarios as IEnumerable<Funcionario>;
if (funcionarios != null && funcionarios.Count() > 0)
{
Console.WriteLine("Nome\t\tCargo");
foreach (var funci in funcionarios)
{
Console.WriteLine(funci.FuncionarioNome + "\t\t" + funci.FuncionarioCargo);
}
}
else
{
Console.WriteLine("Setor não possui funcionários.");
}
Console.WriteLine("");
}
}
Console.ReadLine();
}
}
}
|
|
As instruçoes SQL geradas pelo EF Core foram :
1- Consulta 1:
SELECT [s].[SetorId] AS
[CodigoSetor], [s].[SetorNome] AS [NomeSetor]
FROM [Setores] AS [s]
2- Consulta 2:
SELECT [f].[FuncionarioId],
[f].[FuncionarioCargo], [f].[FuncionarioNome], [f].[SetorId]
FROM [Funcionarios] AS [f]
WHERE [f].[SetorId] = @_outer_SetorId
Esta consulta será executada para cada setor.
Vimos assim as principais consultas LINQ usando SQL Join.
Pegue o projeto completo aqui : EFCore_Joins.zip
Deus nunca foi visto por alguém. O Filho
unigênito, que está no seio do Pai, esse o revelou.
João 1:18
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
EF Core - Usando a abordagem DataBase First - Criando ... - Macoratti
ASP .NET Core e EF Core - Configurando o ambiente - Macoratti