2013-02-20 14 views
5

Sto codificando il mio modo attraverso il tutorial di MS 101 Linq.linq join tipo operatore con sintassi lambda

Provo a eseguire il refactoring della sintassi lambda/method (e viceversa). This una è una sfida per me.

La data query è:

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

che ho ri-scritto in questo modo:

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

(non ho visto un modo semplice per combinare i campi del modulo entrambi i tipi nel nuovo clausola, quindi li ho lasciati separati).

Sembra volare con il compilatore finché non raggiunge i loop di visualizzazione. Il secondo foreach non sembra gestire il tipo.

Ecco il codice di visualizzazione (che funziona con l'espressione di query, ma non con la sintassi lambda/metodo):

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

L'errore è:

istruzione foreach non può operare su variabili di digitare 'JoinOperators.Program.Customer' perché 'JoinOperators.Program.Customer' non contiene una definizione pubblica per 'GetEnumerator'

Ho provato a terminare la mia sintassi lambda/query con una chiamata AsEnumerable(), ma si ottiene comunque lo stesso errore. Non sono sicuro di cosa potrei usare come tipo nel AsEnumerator<type_goes_here> poiché è anonimo e non ho un oggetto che potrei chiamare GetType() su.

Qualche suggerimento?

+2

s è solo una cosa, non una raccolta di cose. –

risposta

5

La sintassi join ... into non è equivalente a Join ma a GroupJoin. Questo è quello che devi usare:

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

Grazie! Ti darò un messaggio quando lo blog su http://georgewashingtoncsharp.wordpress.com/ – micahhoover