Fazer left join em uma query linq requer um "paranauê" um pouco diferente e é isso que vou mostrar neste post.
Um left join é quando retornamos todos os elementos da primeira coleção de dados não importando se estes possuem relação com os elementos da segunda coleção.
Hands On
O primeiro passo para fazer o left join em uma query linq é fazer um join e armazenar o resultado dele em uma variável através do uso da keyword into.
No exemplo abaixo foi feito o join entre a lista de Pessoas e a lista de Carros com base em um objeto Person que corresponde a Car.Owner
O segundo passo é incluir cada elemento da primeira coleção (left) no resultado, mesmo que estes não tenham relação com os elementos da segunda coleção (right). Isso é feito através do método DefaultIfEmpty. Este método retorna um valor padrão para os elementos que não possuem correspondência garantindo que os mesmos sejam retornados pela consulta.
class Person
{
public string Name { get; set; }
public string Nickname { get; set; }
}
class Car
{
public string Brand { get; set; }
public Person Owner { get; set; }
}
Person fabio = new Person { Name = "Fábio", Nickname = "Febola" };
Person diogo = new Person { Name = "Diogo", Nickname = "Diogro" };
Person wellington = new Person { Name = "Wellington", Nickname = "Leitão" };
Person lucas = new Person { Name = "Lucas", Nickname = "Costinha" };
Car honda = new Car { Brand = "Honda", Owner = diogo };
Car nissan = new Car { Brand = "Nissan", Owner = wellington };
Car ford = new Car { Brand = "Ford", Owner = lucas };
// Create two lists.
List<Person> people = new List<Person> {fabio, diogo, wellington, lucas };
List<Car> cars = new List<Car> { honda, nissan, ford };
var query = from person in people
join car in cars on person equals car.Owner into gj
from subcar in gj.DefaultIfEmpty()
select new {
person.Name,
CarBrand = subcar?.Brand ?? String.Empty
};
foreach (var v in query)
{
Console.WriteLine($"{v.Name + ":",-15}{v.CarBrand}");
}
// This code produces the following output:
// Fábio:
// Diogo: Honda
// Wellington: Nissan
// Lucas: Ford
Comments