Núcleo EF Onde

Resumo : neste tutorial, você aprenderá como usar o Where()método EF Core para filtrar dados com base em uma ou mais condições.

Usaremos a Employeeentidade que mapeia a Employeestabela no banco de dados para a demonstração:

Usando o método Where() com o operador igual

O exemplo a seguir usa o Where()método LINQ para localizar funcionários cujo primeiro nome seja "Alexander":

using static System.Console;
using HR;


using var context = new HRContext();


var employees = context.Employees
                .Where(e => e.FirstName == "Alexander")
                .ToList();

foreach (var e in employees)
{
    WriteLine($"{e.FirstName} {e.LastName}");
}Linguagem de código:  C#  ( cs )

Saída:

Alexander Young
Alexander GreenLinguagem de código:  C#  ( cs )

Neste exemplo, o EF Core gera um SQL que usa uma WHEREcláusula para localizar funcionários cujo primeiro nome seja "Alexander":

SELECT 
  [e].[Id], 
  [e].[DepartmentId], 
  [e].[FirstName], 
  [e].[JoinedDate], 
  [e].[LastName], 
  [e].[Salary] 
FROM 
  [Employees] AS [e] 
WHERE 
  [e].[FirstName] = N 'Alexander'
Linguagem de código:  C#  ( cs )

Observe que o EF Core não parametriza a consulta e passa a string literal "Alexander"para o SQL. É vulnerável a ataques de injeção de SQL.

No entanto, se você usar uma variável em vez de uma string literal, o EF Core parametrizará a consulta que pode proteger o aplicativo contra injeções de SQL. Por exemplo:

using static System.Console;
using HR;


using var context = new HRContext();

var firstName = "Alexander";
var employees = context.Employees
                .Where(e => e.FirstName == firstName)
                .ToList();

foreach (var e in employees)
{
    WriteLine($"{e.FirstName} {e.LastName}");
}Linguagem de código:  C#  ( cs )

Neste exemplo, o EF Core parametriza a consulta da seguinte forma:

-- [Parameters=[@__firstName_0='Alexander' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT 
  [e].[Id], 
  [e].[DepartmentId], 
  [e].[FirstName], 
  [e].[JoinedDate], 
  [e].[LastName], 
  [e].[Salary] 
FROM 
  [Employees] AS [e] 
WHERE 
  [e].[FirstName] = @__firstName_0Linguagem de código:  C#  ( cs )

Usando o operador AND

Para consultar dados usando várias condições e combinar a condição usando o ANDoperador, você usa && no Where()método.

Por exemplo, o seguinte usa o Where()método para localizar funcionários cujo nome Alexandere sobrenome são Young:

using static System.Console;
using HR;


using var context = new HRContext();

var firstName = "Alexander";
var lastName = "Young";

var employees = context.Employees
                .Where(e => e.FirstName == firstName
                        && e.LastName == lastName)
                .ToList();

foreach (var e in employees)
{
    WriteLine($"{e.FirstName} {e.LastName}");
}Linguagem de código:  C#  ( cs )

Saída:

Alexander YoungLinguagem de código:  C#  ( cs )

O EF Core gera um SQL que usa uma WHEREcláusula com um ANDoperador:

-- [Parameters=[@__firstName_0='Alexander' (Size = 4000), @__lastName_1='Young' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT 
  [e].[Id], 
  [e].[DepartmentId], 
  [e].[FirstName], 
  [e].[JoinedDate], 
  [e].[LastName], 
  [e].[Salary] 
FROM 
  [Employees] AS [e] 
WHERE 
  [e].[FirstName] = @__firstName_0 
  AND [e].[LastName] = @__lastName_1Linguagem de código:  C#  ( cs )

O exemplo a seguir usa o &&operador para localizar funcionários que ingressam na empresa entre 3/1/2023e 3/31/2023:

using HR;


using var context = new HRContext();


var startDate = new DateTime(2023, 3, 1);
var endDate = new DateTime(2023, 3, 31);

var employees = context.Employees
                        .Where(e => e.JoinedDate >= startDate && e.JoinedDate <= endDate)
                        .ToList();

foreach (var e in employees)
{
    Console.WriteLine($"{e.FirstName} {e.LastName} - {e.JoinedDate.ToShortDateString()}");
}Linguagem de código:  JavaScript  ( javascript )

Saída:

Michael Johnson - 3/5/2023
Alexander Young - 3/18/2023
Sofia Thomas - 3/17/2023
Chloe Young - 3/5/2023
Levi Gonzalez - 3/24/2023

O EF Core gera a seguinte instrução SQL:

-- [Parameters=[@__startDate_0='2023-03-01T00:00:00.0000000', @__endDate_1='2023-03-31T00:00:00.0000000'], CommandType='Text', CommandTimeout='30']
SELECT 
  [e].[Id], 
  [e].[DepartmentId], 
  [e].[FirstName], 
  [e].[JoinedDate], 
  [e].[LastName], 
  [e].[Salary] 
FROM 
  [Employees] AS [e] 
WHERE 
  [e].[JoinedDate] >= @__startDate_0 
  AND [e].[JoinedDate] <= @__endDate_1
Linguagem de código:  PHP  ( php )

Usando o operador OR

Para consultar dados usando múltiplas condições e combiná-los usando o ORoperador, você usa o ||no Where()método.

using static System.Console;
using HR;


using var context = new HRContext();

var firstName = "Emily";
var lastName = "Brown";

var employees = context.Employees
                    .Where(e => e.FirstName == firstName || e.LastName == lastName)
                    .ToList();

foreach (var e in employees)
{
    WriteLine($"{e.FirstName} {e.LastName}");
}Linguagem de código:  C#  ( cs )

Saída:

Emily Brown
Emily Harris
Ethan BrownLinguagem de código:  C#  ( cs )

O EF Core gera um SQL que usa uma WHEREcláusula com um ORoperador:

-- [Parameters=[@__firstName_0='Emily' (Size = 4000), @__lastName_1='Brown' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT 
  [e].[Id], 
  [e].[DepartmentId], 
  [e].[FirstName], 
  [e].[JoinedDate], 
  [e].[LastName], 
  [e].[Salary] 
FROM 
  [Employees] AS [e] 
WHERE 
  [e].[FirstName] = @__firstName_0 
  OR [e].[LastName] = @__lastName_1Linguagem de código:  C#  ( cs )

Resumo

  • Use Where()o método LINQ para filtrar dados.
  • Use &&para formar um ANDoperador.
  • Use ||para formar um ORoperador.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *