5 votes

Veuillez traduire ceci en gardant les mêmes balises HTML s'il y a lieu : type d'opérateur de jointure linq avec syntaxe lambda

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 ?

5voto

Daniel Hilgarth Points 90722

La syntaxe join ... into n'est pas équivalente à Join mais à GroupJoin. C'est ce que vous devez utiliser :

var custSupQuery =
    suppliers.GroupJoin(customers, s => s.Country, c => c.Country,
                        (s, cs) => new { Key = s.Country, Items = cs });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X