Compartilhar via


Como executar junções externas esquerdas (Guia de Programação em C#)

Um left outer join é uma união em que cada elemento da coleção primeiro é retornado, independentemente de se ter quaisquer elementos correlacionados na segunda coleção. Você pode usar LINQ para executar um left outer join chamando o método de DefaultIfEmpty``1 nos resultados de um grupo join.

Exemplo

O exemplo seguinte demonstra como usar o método de DefaultIfEmpty``1 nos resultados de um grupo join para executar um left outer join.

A primeira etapa para gerar um left outer join de duas coleções é executar uma inner join usando um grupo join. (Consulte Como executar junções internas (Guia de Programação em C#) para obter uma explicação deste processo.) Nesse exemplo, a lista de objetos de Person interno- é associado à lista de objetos de Pet baseados em um objeto de Person que corresponde Pet.Owner.

A segunda etapa é incluir cada elemento da coleção primeiro esquerda () no conjunto de resultados mesmo que o elemento não tem nenhuma correspondência na coleção direita. Isso é conseguido chamando DefaultIfEmpty``1 em cada sequência dos elementos correspondentes do grupo join. Nesse exemplo, DefaultIfEmpty``1 é chamado em cada sequência dos objetos de Pet . O método retorna uma coleção que contém um único valor padrão, se a sequência dos objetos de Pet está vazia para qualquer objeto de Person , garantindo assim que cada objeto de Person é representado na coleção de resultado.

Dica

O valor padrão para um tipo de referência é null; como consequência, o exemplo verifica uma referência nula antes de acessar cada elemento de cada coleção de Pet .

        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

  • Crie um novo projeto de aplicativo do console em Visual Studio.

  • Adicione uma referência a System.Core.dll se já não é referenciado.

  • Inclua o namespace de System.Linq .

  • Copie e cole o código de exemplo para o arquivo de module.vb, abaixo do método de Main na classe de Program . Adicione uma linha de código para o método de Main para chamar o método de LeftOuterJoinExample .

  • Executar o programa.

Consulte também

Tarefas

Como executar junções internas (Guia de Programação em C#)

Como executar junções agrupadas (Guia de Programação em C#)

Referência

Join

GroupJoin

Tipos anônimos (Guia de Programação em C#)

Conceitos

Operações join

Tipos anônimos (Visual Basic)