LINQ で複雑な GroupBy を実行しようとしていますが、キー セレクターに問題があります。次のコードでは、キーによって一方向 (SellerID、BuyerID) でグループ化できますが、実際には逆方向 (SellerID、BuyerID または BuyerID、SellerID) でキーによってグループ化する必要があります。このクエリの最終的な目標は、キーが逆になったときに、アセットの金額を負にする必要があることです。これにより、両側に存在する金額を差し引くことができ、その特定の側に金額があるレコードのみが得られます。
次のコードで説明する必要があります。
public class Record
{
public int RecordID;
public int SellerID;
public int BuyerID;
public List<Asset> Assets;
}
public class Asset
{
public int AssetID;
public decimal Amount;
}
var groups = new List<Record>
{
new Record { RecordID = 1, SellerID = 100, BuyerID = 200, Assets = new List<Asset> { new Asset { AssetID = 5, Amount = 10 }}},
new Record { RecordID = 2, SellerID = 100, BuyerID = 200, Assets = new List<Asset> { new Asset { AssetID = 5, Amount = 20 }}},
new Record { RecordID = 3, SellerID = 100, BuyerID = 200, Assets = new List<Asset> { new Asset { AssetID = 6, Amount = 60 }}},
new Record { RecordID = 4, SellerID = 200, BuyerID = 100, Assets = new List<Asset> { new Asset { AssetID = 5, Amount = 40 }}},
new Record { RecordID = 5, SellerID = 200, BuyerID = 100, Assets = new List<Asset> { new Asset { AssetID = 5, Amount = 50 }}},
new Record { RecordID = 6, SellerID = 200, BuyerID = 100, Assets = new List<Asset> { new Asset { AssetID = 6, Amount = 35 }}}
};
var result = groups.GroupBy(
r => new { r.SellerID, r.BuyerID },
r => r.Assets,
(r, assets) => new
{
r.SellerID,
r.BuyerID,
AssetSummation = assets.SelectMany(asset => asset).GroupBy(a => a.AssetID).Select(a2 => new { AssetID = a2.Key, Amount = a2.Sum(a3 => a3.Amount) })
});
私が出力したいのは次のとおりです。
- レコード 1
- 売り手: 100
- バイヤー: 200
- 資産:
- 資産
- アセット ID: 6
- 金額: 25
- 資産
- レコード 2
- 売り手: 200
- バイヤー: 100
- 資産:
- アセット ID: 5
- 金額: 60
いいスタートが切れたと思いますが、ここからどこへ行けばいいのかわかりません。キーをひっくり返して金額をマイナスにして合計できるようにするにはどうすればよいですか? それができたら、値が 0 のアセット行を除外できると思います (つまり、レコードが逆に満たされたことを意味します)。
編集 #1: おそらく私がやろうとしているのは、グループ変数をそれ自体に結合して、結合の両側で一致するすべてのレコードを合計することです。したがって、左側の SellerID を右側の BuyerID に結合し、左側の BuyerID を右側の SellerID に結合することになります。