2010-09-30 44 views
9

Tôi muốn sử dụng LINQ để nhóm dữ liệu từ một DataTable (cột: userid, chargetag, phí).Sử dụng LINQ để nhóm dữ liệu từ DataTable

Nội dung có thể trông như thế này:

userid chargetag charge 
----------------------------- 
user1  tag3   100 
user2  tag3   100 
user3  tag5   250 

tôi cần một cái gì đó như thế này kết quả là:

chargetag count sum 
------------------------- 
tag3   2  200 
tag5   1  250 

Đây là những gì tôi có cho đến nay:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        let count = g.Count() 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = count, 
        }; 

tôi có thể trích xuất tên của chargetag và số của nó. Tôi phải thay đổi truy vấn LINQ để truy cập vào tổng chi phí như thế nào?

Cảm ơn trước :-)

Kính trọng, Kevin

Trả lời

34

Đó là khá dễ dàng - chỉ cần sử dụng các phương pháp Sum mở rộng trên nhóm.

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = g.Count(), 
         ChargeSum = g.Sum(x => x.Field<int>("charge")) 
        }; 

(Tôi đã loại bỏ các khoản let đây vì nó đã không thực sự mua bạn bất cứ điều gì.)

Bây giờ thể thể không hiệu quả; nó có thể kết thúc nhóm hai lần để thực hiện hai phép toán tổng hợp. Bạn thể khắc phục điều đó giống như với một sự tiếp nối truy vấn như thế này, nếu bạn thực sự muốn:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        select new 
        { 
         ChargeTag = g.Key, 
         List = g.ToList(), 
        } into g 
        select new 
        { 
         g.ChargeTag, 
         Count = g.List.Count, 
         ChargeSum = g.List.Sum(x => x.Field<int>("charge")) 
        }; 

Hoặc với một điều khoản let thay vì:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        let list = g.ToList() 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = list.Count, 
         ChargeSum = list.Sum(x => x.Field<int>("charge")) 
        }; 
+0

đẹp giải thích (như thường lệ). Tôi muốn được quan tâm để biết nếu tùy chọn đầu tiên thực sự nhóm hai lần hoặc nếu nó được tối ưu hóa. – kjn

+0

Hoạt động hoàn hảo (tất nhiên ;-)) Cảm ơn bạn lần nữa! – bitfrickler

+0

@Jon Skeet: Cách tốt nhất để tôi nắm bắt tất cả những thứ LINQ này là gì? Tôi đã có cuốn sách 'C# In Depth' của bạn, nhưng tôi bị lạc trong phần LINQ (như ví dụ của bạn ở trên). Phần còn lại của công cụ mã hóa không quá tệ. – jp2code

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