2013-03-24 21 views
14

Mam zbiór elementów, to jest tutaj:Używanie LINQ do grupy o różnych właściwościach i sumy

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 

Chciałbym te elementy mają być grupowane w oparciu o AgencyID, VendorID i StateID i Total obliczona z kwotą i opłat (kwota + opłata)

Więc wykorzystując dane powyżej, chciałbym mieć te wyniki:

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 

Oto wszystko, co mam teraz, który właśnie trafia każdy rząd w danych podstawa:

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

Czy ktoś wie jak mogę filtrować i grupa ta z LINQ?

Odpowiedz

40

Użyj .Select() po grupowaniu:

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

Myślę, że brakuje wam "Kluczowej" własności. –

+0

@MartinMulder: Thanks! Masz rację. Zaktualizowałem mój kod. –

14

Linus jest na miejscu w podejściu, ale kilka właściwości są wyłączone. Wygląda na to, że "AgencyContractId" jest kluczem podstawowym, który nie jest powiązany z wynikiem, który chcesz przekazać użytkownikowi. Myślę, że właśnie tego chcesz (zakładając, że zmieniasz swój ViewModel, aby pasował do danych, które chcesz powiedzieć w swoim widoku).

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) 
        }); 
Powiązane problemy