Je code à travers le tutoriel MS 101 Linq.
J'essaie de refactoriser la requête en syntaxe lambda/méthode (et vice-versa). Celui-ci est un défi pour moi.
La requête donnée est :
var custSupQuery =
from sup in suppliers
join cust in customers on sup.Country equals cust.Country into cs
select new { Key = sup.Country, Items = cs };
Que j'ai réécrit comme ceci :
var custSupQuery = suppliers.Join(customers, s => s.Country, c => c.Country, (c, s) => new { Key = s.Country, Items = s, Items2 = c });
(Je n'ai pas vu de moyen facile de combiner les champs des deux types dans la nouvelle clause, donc je les ai laissés séparés).
Cela semble fonctionner avec le compilateur jusqu'aux boucles d'affichage. La 2ème boucle ne semble pas pouvoir gérer le type.
Voici le code d'affichage (qui fonctionne avec l'expression de requête mais pas avec la syntaxe lambda/méthode) :
foreach (var item in custSupQuery)
{
Console.WriteLine(item.Key + ":");
foreach (var element in item.Items) // <-- erreur ici
{
Console.WriteLine(" " + element.CompanyName);
}
}
L'erreur est :
L'instruction foreach ne peut pas fonctionner sur des variables de type 'JoinOperators.Program.Customer' car 'JoinOperators.Program.Customer' ne contient pas de définition publique pour 'GetEnumerator'
J'ai essayé de terminer ma syntaxe lambda/requête avec un appel AsEnumerable()
, mais j'obtiens toujours la même erreur. Je ne suis pas sûr de ce que je pourrais utiliser comme type dans le AsEnumerator
puisque c'est anonyme et je ne semble pas avoir d'objet sur lequel je pourrais appeler GetType()
.
Des suggestions ?