Procedura: eseguire dei left outer join (Guida per programmatori C#)
Un left outer join è un join nel quale viene restituito ogni elemento della prima raccolta, indipendentemente dal fatto che disponga di elementi correlati nella seconda raccolta.È possibile utilizzare LINQ per eseguire un left outer join chiamando il metodo di 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 raccolte 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 di Person è unito tramite inner join all'elenco di oggetti di Pet basati su un oggetto di Person che corrisponde Pet.Owner.
Il secondo passaggio consiste nell'includere ogni elemento della prima raccolta (di sinistra) nel set di risultati anche se tale elemento non ha corrispondenze nella raccolta di destra.Questa operazione viene eseguita chiamando DefaultIfEmpty su ogni sequenza di elementi corrispondenti dal join di gruppo.In questo esempio, DefaultIfEmpty viene chiamato a ogni sequenza di associare gli oggetti di Pet.Il metodo restituisce una raccolta che contiene un solo valore predefinito, se la sequenza di associare gli oggetti di Pet è vuota per qualsiasi oggetto di Person, assicurando pertanto che ogni oggetto di Person è rappresentato nella raccolta di risultati.
[!NOTA]
Il valore predefinito per un tipo di riferimento è null; pertanto, i controlli di esempio per un riferimento Null prima di accedere a ogni elemento di ogni raccolta di 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 è già presente un riferimento.
Includere lo spazio dei nomi System.Linq.
Copiare e incollare il codice nell'esempio nel file program.cs, nel metodo di Main nella classe di Program.Aggiungere una riga di codice al metodo di Main per chiamare il metodo di LeftOuterJoinExample.
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
Tipi anonimi (Guida per programmatori C#)