2010-09-30 13 views
9

Bir DataTable'dan veri toplamak için LINQ kullanmak istiyorum (sütunlar: userid, chargetag, charge).DataTable'dan veri gruplamak için LINQ kullanın

içerik bu gibi görünebilir:

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

Ben sonuç olarak böyle bir şey gerekir:

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

I:

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

Bu benim bugüne kadar ne olduğu ücret etiketinin adını ve numarasını çıkarabilir. Ücretlerin toplamına erişmek için LINQ sorgusunu nasıl değiştirmeliyim? peşin

Teşekkür

Saygılar :-), oldukça kolay Kevin

cevap

34

- sadece grup Sum uzatma yöntemini kullanın.

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

(gerçekten bir şey satın değildi olarak burada let maddesini kaldırdık.)

Şimdi bu verimsiz olabilir; İki toplama işlemini gerçekleştirmek için iki kez gruplandırabilir. Eğer gerçekten isteseydiniz , böyle bir sorgu devamı olduğu gibi düzeltmek olabilir:

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

Veya bunun yerine bir let maddesi ile

:

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

Güzel açıklama (her zamanki gibi). İlk seçeneğin iki kez mi gruplandığını mı yoksa optimize edildi mi olduğunu bilmek isterdim. – kjn

+0

Mükemmel çalışır (elbette ;-)) Tekrar teşekkürler! – bitfrickler

+0

@Jon Skeet: Tüm bu LINQ malzemelerini kavramanın iyi bir yolu nedir? Senin C# Derinlik kitabını aldım, ama LINQ bölümünde kayboluyorum (yukarıdaki örnekte olduğu gibi). Kodlama malzemelerinin geri kalanı çok kötü değil. – jp2code

İlgili konular