Использование LINQ для группировки по нескольким свойствам и сумме
У меня есть набор элементов, вот он:
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
Я бы хотел, чтобы эти элементы были сгруппированы на основе идентификаторов агентства, VendorID и 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?
Ответы
Ответ 1
Используйте .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)
});
Ответ 2
В подходе находится Linus, но некоторые свойства отключены. Похоже, что "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)
});