2013-03-24 28 views
14

我有項目的集合,在這裏它是:使用LINQ to組由多個屬性和金額

AgencyID VendorID StateID Amount Fee 
1  1  1  20.00 5.00 
1  1  1  10.00 2.00 
1  1  1  30.00 8.00  
2  2  1  20.00 5.00 
2  2  1  5.00 5.00 
1  1  2  20.00 5.00 
2  2  2  20.00 5.00 
2  2  2  40.00 9.00 
1  2  2  35.00 6.00 
1  2  2  12.00 3.00 

我想這些項目立足於AgencyID,廠商ID,並STATEID分組,從金額和手續費(金額+手續費)計算的總

因此,在使用上述數據,我想有以下結果:

AgencyID VendorID StateID Total 
1  1  1  75.00  
2  2  1  35.00 
1  1  2  25.00 
2  2  2  74.00 
1  2  2  56.00 

這就是我現在所擁有的,它只是得到每一行在數據中基地:

var agencyContracts = _agencyContractsRepository.AgencyContracts. 
    Select(ac => new AgencyContractViewModel 
    { 
     AgencyContractId = ac.AgencyContractID, 
     AgencyId = ac.AgencyID, 
     VendorId = ac.VendorID, 
     RegionId = ac.RegionID, 
     Amount = ac.Amount, 
     Fee = ac.Fee 
    }); 

有誰知道我怎麼可以過濾和分組與LINQ?

回答

40

使用.Select()分組後:

var agencyContracts = _agencyContractsRepository.AgencyContracts 
    .GroupBy(ac => new 
        { 
         ac.AgencyContractID, // required by your view model. should be omited 
              // in most cases because group by primary key 
              // makes no sense. 
         ac.AgencyID, 
         ac.VendorID, 
         ac.RegionID 
        }) 
    .Select(ac => new AgencyContractViewModel 
        { 
         AgencyContractID = ac.Key.AgencyContractID, 
         AgencyId = ac.Key.AgencyID, 
         VendorId = ac.Key.VendorID, 
         RegionId = ac.Key.RegionID, 
         Amount = ac.Sum(acs => acs.Amount), 
         Fee = ac.Sum(acs => acs.Fee) 
        }); 
+1

我覺得你錯過了'Key'屬性。 – 2015-07-24 14:10:38

+0

@MartinMulder:謝謝!你是對的。更新我的代碼。 – 2015-07-24 16:37:01

14

萊納斯是在接近現貨,但幾個屬性都關閉。它看起來像'AgencyContractId'是你的主鍵,它與你想給用戶的輸出無關。我認爲這是你想要的(假設你改變你的ViewModel以匹配你在視圖中說的數據)。

var agencyContracts = _agencyContractsRepository.AgencyContracts 
    .GroupBy(ac => new 
        { 
         ac.AgencyID, 
         ac.VendorID, 
         ac.RegionID 
        }) 
    .Select(ac => new AgencyContractViewModel 
        { 
         AgencyId = ac.Key.AgencyID, 
         VendorId = ac.Key.VendorID, 
         RegionId = ac.Key.RegionID, 
         Total = ac.Sum(acs => acs.Amount) + ac.Sum(acs => acs.Fee) 
        });