2013-02-20 60 views
5

我正在編寫通過MS 101 Linq教程的方法。linq使用lambda語法加入運算符類型

我嘗試將查詢重構爲lambda/method語法(反之亦然)。 This對我來說是一個挑戰。

給出的查詢是:

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

其中我重新寫這樣的:

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

(我沒有看到一個簡單的方法來組合使用領域,在新形成兩種類型條款,所以我把它們分開)。

這似乎與編譯器一起飛行,直到它到達顯示循環。第二個foreach似乎無法處理這種類型。

這裏是顯示代碼(其與查詢表達式,但不與拉姆達/方法的語法作品):

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

錯誤是:

foreach語句不能在變量操作鍵入 'JoinOperators.Program.Customer',因爲 'JoinOperators.Program.Customer'不包含公共定義 'GetEnumerator'

我試圖用AsEnumerable()調用結束我的lambda/query語法,但它仍然得到相同的錯誤。我不確定我可以在AsEnumerator<type_goes_here>中使用哪種類型,因爲它是匿名的,我似乎沒有可以調用GetType()的對象。

有什麼建議嗎?

+2

s只是一件事,而不是一個東西的集合。 – 2013-02-20 14:49:25

回答

5

join ... into語法不等於Join而是GroupJoin。這就是你必須使用的:

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

謝謝!當我在http://georgewashingtoncsharp.wordpress.com/上發佈這篇文章時,我會給你留言。 – micahhoover 2013-02-20 15:00:08