Como: Executar associações externas (guia de programação translation from VPE for Csharp) à esquerda
A junção externa esquerda é uma unir na qual cada elemento da primeira coleção é retornado, independentemente de ele ter quaisquer elementos correlacionados na segunda coleção.Você pode usar LINQ para executar um junção externa esquerda chamando DefaultIfEmpty nos resultados de uma unir de agrupar.
Exemplo
O exemplo a seguir demonstra como usar o DefaultIfEmpty método nos resultados de uma unir de agrupar para executar um junção externa esquerda.
A primeira etapa para produzir uma unir externa à esquerda das duas coleções é executar uma junção interna, usando uma unir de agrupar.(See Como: Executar associações interna (guia de programação translation from VPE for Csharp) Para obter uma explicação sobre esse processo.) Neste exemplo, a lista de Person objetos é interno associado à lista de Pet objetos com base em um Person correspondência de objeto Pet.Owner.
A segunda etapa é incluir cada elemento da coleção primeira (esquerda) no conjunto de resultados, mesmo que esse elemento não tem nenhuma correspondência na coleção à direita.Isso é realizado chamando DefaultIfEmpty em cada sequência de correspondência de elementos de unir de agrupar. Neste exemplo, DefaultIfEmpty é chamado em cada sequência de correspondentes Pet objetos. Retorna uma coleção que contém um valor padrão simples, se a sequência de correspondentes Pet objetos está vazia para qualquer Person objeto, garantindo que cada Person objeto é representado no conjunto resultado.
Observação: |
---|
O valor padrão para um tipo de referência é null; Portanto o exemplo verifica se há uma referência nula antes de acessar cada elemento de cada Pet coleção. |
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
public static void LeftOuterJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };
var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };
foreach (var v in query)
{
Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
}
}
// This code produces the following output:
//
// Magnus: Daisy
// Terry: Barley
// Terry: Boots
// Terry: Blue Moon
// Charlotte: Whiskers
// Arlene:
Compilando o código
Criar um novo projeto Console aplicativo em Visual Studio.
Adicione uma referência a sistema.Core.dll se ele já não é referenciado.
Incluir o System.Linq espaço para nome.
Copie e cole o código do exemplo no arquivo programa.cs, abaixo de Main método. Adicionar uma linha de código para o Main método para chamar o método que você colou no.
Execute o programa.
Consulte também
Tarefas
Como: Executar associações interna (guia de programação translation from VPE for Csharp)
Como: Executar associações agrupadas (guia de programação translation from VPE for Csharp)
Conceitos
Referência
Tipos anônimo (guia de programação translation from VPE for Csharp)