Comment : effectuer des jointures externes gauches (Guide de programmation C#)
Mise à jour : novembre 2007
Une jointure externe gauche est une jointure dans laquelle chaque élément de la première collection est retourné, indépendamment, le cas échéant, des éléments corrélés dans la deuxième collection. Vous pouvez utiliser LINQ pour effectuer une jointure externe gauche en appelant DefaultIfEmpty sur les résultats d'une jointure groupée.
Exemple
L'exemple suivant montre comment utiliser la méthode DefaultIfEmpty sur les résultats d'une jointure groupée pour effectuer une jointure externe gauche.
La première étape pour produire une jointure externe gauche de deux collections consiste à effectuer une jointure interne en utilisant une jointure groupée. Consultez Comment : effectuer des jointures internes (Guide de programmation C#) pour obtenir une explication de ce processus. Dans cet exemple, la liste d'objets Person est liée par une jointure interne à la liste d'objets Pet à partir d'un objet Person correspondant à Pet.Owner.
La deuxième étape consiste à inclure chaque élément de la première collection (gauche) dans le jeu de résultats même si cet élément n'a aucune correspondance dans la collection de droite. Cela est accompli en appelant DefaultIfEmpty sur chaque séquence d'éléments correspondants de la jointure groupée. Dans cet exemple, DefaultIfEmpty est appelé sur chaque séquence d'objets Pet correspondants. Il retourne une collection qui contient une valeur unique par défaut si la séquence d'objets Pet correspondants est vide pour tout objet Person. Cela permet de garantir de cette façon que chaque objet Person est représenté dans la collection de résultats.
Remarque : |
---|
La valeur par défaut pour un type référence est null ; par conséquent, l'exemple vérifie la présence d'une référence nulle avant d'accéder à chaque élément de chaque collection 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:
Compilation du code
Créez un projet d'application console dans Visual Studio.
Ajoutez une référence à System.Core.dll si elle n'est pas déjà référencée.
Incluez l'espace de noms System.Linq.
Copiez et collez le code à partir de l'exemple dans le fichier program.cs, sous la méthode Main. Ajoutez une ligne de code à la méthode Main pour appeler la méthode que vous avez collée.
Exécutez le programme.
Voir aussi
Tâches
Comment : effectuer des jointures internes (Guide de programmation C#)
Comment : effectuer des jointures groupées (Guide de programmation C#)