20

私はアイテムのコレクションを持っています、ここにあります:

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、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でフィルタリングしてグループ化する方法を知っている人はいますか?

4

2 に答える 2

63

.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)
                   });
于 2013-03-24T23:51:48.847 に答える
18

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)
                   });
于 2013-03-25T00:40:29.513 に答える