2013-02-20 33 views
5

Tôi đang mã hóa theo cách của mình thông qua hướng dẫn MS 101 Linq.linq tham gia loại toán tử với cú pháp lambda

Tôi cố gắng truy vấn lại cấu trúc theo cú pháp lambda/phương thức (và ngược lại). This là một thách thức đối với tôi.

Các truy vấn cụ thể là:

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

Mà tôi lại viết như thế này:

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

(Tôi không thấy một cách dễ dàng để kết hợp các lĩnh vực hình thành cả hai loại trong các mới khoản, vì vậy tôi rời chúng riêng biệt).

Điều này dường như bay với trình biên dịch cho đến khi nó được đưa vào vòng hiển thị. Các foreach thứ hai dường như không thể xử lý các loại.

Đây là đoạn mã hiển thị (trong đó làm việc với các biểu thức truy vấn nhưng không phải với cú pháp lambda/phương pháp):

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

Lỗi này là:

tuyên bố foreach không thể hoạt động trên các biến của loại 'Tham giaOperators.Program.Customer' vì 'JoinOperators.Program.Customer' không chứa định nghĩa công khai cho 'GetEnumerator'

Tôi đã thử kết thúc cú pháp lambda/truy vấn của mình với cuộc gọi AsEnumerable() nhưng vẫn gặp lỗi tương tự. Tôi không chắc chắn những gì tôi có thể sử dụng như là loại trong AsEnumerator<type_goes_here> vì nó ẩn danh và tôi dường như không có một đối tượng tôi có thể gọi GetType() trên.

Mọi đề xuất?

+2

s chỉ là một thứ, không phải là tập hợp các thứ. –

Trả lời

5

Cú pháp join ... into không tương đương với Join nhưng đến GroupJoin. Đó là những gì bạn phải sử dụng:

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

Cảm ơn! Tôi sẽ cung cấp cho bạn một tiếng hét khi tôi viết blog này tại http://georgewashingtoncsharp.wordpress.com/ – micahhoover