Procedura: eseguire dei left outer join (Guida per programmatori C#)

Un left outer join è un join nel quale viene restituito ogni elemento del primo insieme, indipendentemente dal fatto che disponga di elementi correlati nel secondo insieme. È possibile utilizzare LINQ per eseguire un left outer join chiamando°DefaultIfEmpty°sui risultati di un join di gruppo.

Esempio

Nell'esempio seguente viene dimostrato come utilizzare il metodo DefaultIfEmpty sui risultati di un join di gruppo per eseguire un left outer join.

Il primo passaggio nella produzione di un left outer join di due insiemi consiste nell'esecuzione di un inner join utilizzando un join di gruppo. Per ulteriori informazioni su questo processo, vedere Procedura: eseguire degli inner join (Guida per programmatori C#). In questo esempio, l'elenco di oggetti Person è unito tramite inner join all'elenco di oggetti Pet in base a un oggetto Person corrispondente a Pet.Owner.

Il secondo passaggio consiste nell'includere ogni elemento del primo (a sinistra) insieme nel set di risultati anche se tale elemento non ha corrispondenze nell'insieme di destra. Questa operazione viene eseguita chiamando DefaultIfEmpty su ogni sequenza di elementi corrispondenti dal join di gruppo. In questo esempio, DefaultIfEmpty viene richiamato su ogni sequenza di oggetti Pet corrispondenti. Restituisce un insieme che contiene un solo valore predefinito, se la sequenza di oggetti Pet corrispondenti è vuota per qualsiasi oggetto Person, assicurando pertanto che ogni oggetto Person sia rappresentato nel risultato di risultati.

Nota

Il valore predefinito per un tipo di riferimento è null. Pertanto nell'esempio viene cercato un riferimento null prima di accedere a ogni elemento di ogni insieme 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:

Compilazione del codice

  • Creare un nuovo progetto Applicazione console in Visual Studio.

  • Aggiungere un riferimento a System.Core.dll, se non vi è già fatto riferimento.

  • Includere lo spazio dei nomi System.Linq.

  • Copiare e incollare il codice dall'esempio nel file program.cs, sotto il metodo Main. Aggiungere una riga di codice al metodo Main per chiamare il metodo in cui è stata eseguita l'operazione Incolla.

  • Eseguire il programma.

Vedere anche

Attività

Procedura: eseguire degli inner join (Guida per programmatori C#)

Procedura: eseguire dei join raggruppati (Guida per programmatori C#)

Riferimenti

Join

GroupJoin

Tipi anonimi (Guida per programmatori C#)

Concetti

Operazioni di join

Anonymous Types