LINQ Intérieure-Rejoignez-Gauche-Rejoindre
À l'aide de l'extension de la syntaxe, je suis en train de créer une gauche de la jointure à l'aide de LINQ sur deux listes que j'ai. Ce qui suit est l'aide de Microsoft mais je l'ai modifié de façon à n'afficher que la liste des animaux de compagnie n'a pas d'éléments. Ce que je suis de se retrouver avec une liste de 0 éléments. Je suppose que c'est parce que l'intérieur de la jointure est de prendre place. Ce que j'ai envie de finir avec une liste de 3 éléments (les 3 objets de la Personne) avec des données nulles remplis pour les éléments manquants. c'est à dire de Gauche de la Rejoindre. Est-ce possible?
Person magnus = new Person { Name = "Hedlund, Magnus" };
Person terry = new Person { Name = "Adams, Terry" };
Person charlotte = new Person { Name = "Weiss, Charlotte" };
//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 daisy = new Pet { Name = "Daisy", Owner = magnus };
List<Person> people = new List<Person> { magnus, terry, charlotte };
//List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };
List<Pet> pets = new List<Pet>();
//Create a list of Person-Pet pairs where
//each element is an anonymous type that contains a
//Pet's name and the name of the Person that owns the Pet.
var query =
people.Join(pets,
person => person,
pet => pet.Owner,
(person, pet) =>
new { OwnerName = person.Name, Pet = pet.Name }).ToList();
Vous devez vous connecter pour publier un commentaire.
Je pense que si vous voulez utiliser des méthodes d'extension, vous devez utiliser le GroupJoin
Vous pourriez avoir à jouer avec la sélection de l'expression. Je ne suis pas sûr qu'il pourrait vous donner ce que vous voulez faire dans le cas où vous avez un 1 à plusieurs relations.
Je pense que c'est un peu plus facile avec la syntaxe de Requête LINQ
Vous avez besoin pour obtenir le joint d'objets dans un ensemble et ensuite appliquer DefaultIfEmpty comme JPunyon dit:
Sorties:
join pet...
etfrom ownedPet...
avec la seule ligne:from pet in pets.Where(x => person.Name == x.Owner.Name).DefaultIfEmpty()
J'ai le message d'erreur suivant lorsqu'ils sont confrontés à ce même problème:
Le type de l'une des expressions de la clause de jointure est incorrect. L'inférence de Type a échoué dans l'appel à 'GroupJoin'.
Résolu lorsque j'ai utilisé le même nom de propriété, il a travaillé.
(...)
(...)
Voici un bon blog qui vient d'être posté par Fabrice (auteur de LINQ in Action), qui couvre le matériel dans la question que j'ai demandé. Je vais mettre ici pour référence comme les lecteurs de la question sera de trouver cela utile.
La conversion des requêtes LINQ de la syntaxe de la requête de la méthode/de l'opérateur syntaxe
Gauche rejoint dans LINQ sont possibles avec le DefaultIfEmpty() la méthode. Je n'ai pas la syntaxe exacte pour votre cas, si...
En fait, je pense que si vous venez de changer les animaux de compagnie animaux de compagnie.DefaultIfEmpty() dans la requête qu'il pourrait fonctionner...
EDIT: je ne devrais vraiment pas répondre à choses quand la fin...
Si vous avez une base de données, c'est le plus simple: