2013-02-20 16 views
5

Koduję sobie drogę przez samouczek MS 101 Linq.Typ operatora linq join ze składnią lambda

Próbuję refactorować zapytanie do składni lambda/metody (i na odwrót). This jedno jest dla mnie wyzwaniem.

Podana zapytania to:

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 }; 

Który ja ponownie napisał tak:

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

(nie widzę łatwy sposób połączyć oba rodzaje pól formularza w nowej zdanie, więc zostawiłem je osobno).

To wydaje się latać z kompilatorem, dopóki nie dostanie się do pętli wyświetlacza. Drugi foreach nie może obsługiwać tego typu.

Oto kod wyświetlacz (który współpracuje z wyrażeniu kwerendy, ale nie ze składnią lambda/metoda):

foreach (var item in custSupQuery) 
{ 
    Console.WriteLine(item.Key + ":"); 
    foreach (var element in item.Items) // <-- error here 
    { 
     Console.WriteLine(" " + element.CompanyName); 
    } 
} 

błędu jest:

oświadczenie foreach nie może działać w zmiennych typ "JoinOperators.Program.Customer" ponieważ "JoinOperators.Program.Customer" nie zawiera publicznej definicji dla "GetEnumerator"

Próbowałem zakończyć moją składnię lambda/zapytania za pomocą wywołania AsEnumerable(), ale wciąż otrzymuje ten sam błąd. Nie jestem pewien, co mogę użyć jako typ w AsEnumerator<type_goes_here>, ponieważ jest anonimowy i nie wydaje mi się, aby obiekt mógł być nazwany GetType().

Wszelkie sugestie?

+2

s to tylko jedna rzecz, a nie zbiór rzeczy. –

Odpowiedz

5

Składnia join ... into nie jest równoważna z Join, ale z GroupJoin. To właśnie musisz użyć:

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

Dzięki! Dam ci krzyk, kiedy bloguję ten na http://georgewashingtoncsharp.wordpress.com/ – micahhoover

Powiązane problemy