2009-06-08 37 views
17

Truy vấn sau trông như thế nào nếu tôi đang sử dụng cú pháp phương pháp mở rộng?GroupBy với cú pháp phương thức LINQ (không phải cú pháp truy vấn)

var query = from c in checks 
group c by string.Format("{0} - {1}", c.CustomerId, c.CustomerName) 
into customerGroups 
select new { Customer = customerGroups.Key, Payments = customerGroups } 
+0

Để tham khảo trong tương lai, câu hỏi này được trả lời trong đặc điểm kỹ thuật C# 3.0, bạn có thể tải xuống Internet. Tất cả các quy tắc chuyển đổi truy vấn được chỉ định ở đó. –

+0

ty, không biết các quy tắc chuyển đổi đã được ghi chép. –

Trả lời

22

Nó sẽ trông như thế này:

var query = checks 
    .GroupBy(c => string.Format("{0} - {1}", c.CustomerId, c.CustomerName)) 
    .Select (g => new { Customer = g.Key, Payments = g }); 
3

Kể từ khi trình biên dịch hiện bản dịch này cho bạn, cháy lên Reflector và có một cái nhìn.

8

Đầu tiên, câu trả lời cơ bản:

var query = checks.GroupBy<Customer, string>(delegate (Customer c) { 
    return string.Format("{0} - {1}", c.CustomerId, c.CustomerName); 
}).Select(delegate (IGrouping<string, Customer> customerGroups) { 
    return new { Customer = customerGroups.Key, Payments = customerGroups }; 
}); 

Sau đó, làm thế nào để bạn tìm ra những điều mình?

Trước tiên, hãy tải xuống Trình phản xạ từ here và cài đặt.

Sau đó, xây dựng một chương trình mẫu, như chương trình bảng điều khiển nhỏ, chứa mã bạn muốn phân tích. Đây là mã tôi đã viết:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication11 
{ 
    public class Customer 
    { 
     public Int32 CustomerId; 
     public Int32 CustomerName; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var checks = new List<Customer>(); 
      var query = from c in checks 
         group c by String.Format("{0} - {1}", c.CustomerId, c.CustomerName) 
          into customerGroups 
          select new { Customer = customerGroups.Key, Payments = customerGroups }; 
     } 
    } 
} 

Sau đó, bạn xây dựng và mở phản xạ và yêu cầu mở tệp .exe đang đề cập đến.

Sau đó, bạn điều hướng đến phương thức được đề cập, trong trường hợp của tôi là ConsoleApplication11.Program.Main.

Bí quyết ở đây là truy cập trang tùy chọn của Trình phản xạ và yêu cầu hiển thị cú pháp C# 2.0, thay thế LINQ bằng các cuộc gọi phương thức tĩnh thích hợp. Làm điều đó mang lại cho tôi đoạn mã sau:

private static void Main(string[] args) 
{ 
    List<Customer> checks = new List<Customer>(); 
    var query = checks.GroupBy<Customer, string>(delegate (Customer c) { 
     return string.Format("{0} - {1}", c.CustomerId, c.CustomerName); 
    }).Select(delegate (IGrouping<string, Customer> customerGroups) { 
     return new { Customer = customerGroups.Key, Payments = customerGroups }; 
    }); 
} 

Bây giờ, tất nhiên mã này có thể được viết một chút đẹp hơn với lambdas và tương tự, giống như những gì @mquandershowed, nhưng với suy nghi, ít nhất bạn sẽ có thể hiểu được các cuộc gọi phương thức được tham gia.

+0

ReSharper cũng có chuyển đổi thành/từ cú pháp truy vấn. – bzlm

1

Tôi biết đây là câu hỏi cũ nhưng đối với người đọc mới, hãy xem mã this gitub.

Sử dụng Roslyn này để nhận cú pháp truy vấn và chuyển đổi cú pháp thành cú pháp phương thức tiện ích mở rộng.

Các vấn đề liên quan