Comment : effectuer des jointures externes gauches (Guide de programmation C#)
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 la méthode d' DefaultIfEmpty``1 sur les résultats d'une jointure groupée.
Exemple
L'exemple suivant montre comment utiliser la méthode DefaultIfEmpty``1 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 d' Person INNER- est attachée à la liste d'objets d' Pet sur un objet d' Person qui correspond à 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``1 sur chaque séquence d'éléments correspondants de la jointure groupée. Dans cet exemple, DefaultIfEmpty``1 est appelé à chaque séquence de correspondre à des objets d' Pet . La méthode retourne une collection qui contient un seul, valeur par défaut si la séquence de correspondre à des objets d' Pet est vide pour tout objet d' Person, garantissant ainsi que chaque objet d' Person est représenté dans la collection de résultats.
Notes
La valeur par défaut pour un type référence est null; par conséquent, l'exemple vérifie une référence null avant d'accéder à chaque élément de chaque collection d' 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 de l'exemple dans le fichier program.cs, sous la méthode d' Main dans la classe d' Program . Ajoutez une ligne de code à la méthode d' Main pour appeler la méthode d' LeftOuterJoinExample .
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#)
Référence
Types anonymes (Guide de programmation C#)