2013-03-24 27 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) 
        });