Partilhar via


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

Junção operações

Tipos anônimos

Referência

Join

GroupJoin

Tipos anônimo (guia de programação translation from VPE for Csharp)