2010-03-31 505 views
4

我有一個非常簡單的例子,我開始使用foreach()解決,但後來我認爲我可以使用Linq來完成。LinQ to objects GroupBy()by object and Sum()by amount

基本上我有IList包含PaymentTransaction對象和有2個屬性DealerAmount

我想GroupBy()DealerSum()Amount

我試圖做到這一點使用下面的代碼,但不幸的是它不工作:

var test = paymentTransactionDao.GetAll().GroupBy(x => x.Dealer).Sum(x => x.Amount); 

究竟我做錯了的是什麼?

回答

13

的問題是你真正想要得到的結果是有點不清楚,所以我假設你希望每個組中總結的量:

var test = 
    paymentTransactionDao.GetAll() 
    .GroupBy(x => x.Dealer) 
    .Select(g => new { Dealer = g.Key, Sum = g.Sum(x => x.Amount) }); 
+0

你需要'GetAll'嗎? – Gabe 2010-03-31 07:36:38

+0

謝謝,這個作品! – 2010-03-31 07:42:19

+0

@gabe:我不知道,我不假設什麼樣的對象是或者除了那個之外的方法是什麼返回一個集合。 – Guffa 2010-03-31 08:26:18

2

GroupBy將返回一堆IGrouping<string, PaymentTransaction>(假設經銷商是一個字符串)。試試這個:

...GroupBy(...).Select(x => new {Dealer=x.Key, Amount=x.Sum(xx => xx.Amount)}); 

(只是猜測,因爲我沒有VS.前)

2

使用groupby overload其通過根據其鍵從而產生從每個組和密鑰的結果值取序列消除了對選擇的需要。然後投影每個元素:

GroupBy(pt => pt.Dealer, 
     pt => pt.Amount, 
     (dealer, amount) => new { 
            Dealer = dealer, 
            TotalAmount = amount.Sum() 
           } 
     )