[.net] 複数の列によるグループ化


Answers

手順サンプル

.GroupBy(x => new { x.Column1, x.Column2 })
Question

LINQでGroupBy複数列を実行する方法

SQLでこれに似たもの:

SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>

これをLINQに変換するにはどうすればいいですか?

QuantityBreakdown
(
    MaterialID int,
    ProductID int,
    Quantity float
)

INSERT INTO @QuantityBreakdown (MaterialID, ProductID, Quantity)
SELECT MaterialID, ProductID, SUM(Quantity)
FROM @Transactions
GROUP BY MaterialID, ProductID



C#7以降、値タプルを使用することもできます。

group x by (x.Column1, x.Column2)

または

.GroupBy(x => (x.Column1, x.Column2))



xをnew {x.Col、x.Col}でグループ化する




var Results= query.GroupBy(f => new { /* add members here */  });



複数の列でグループ化する場合は、代わりにこれを試してみてください...

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

同じ方法で、Column3、Column4などを追加できます。




注意すべきことは、ラムダ式のオブジェクトを送信する必要があり、クラスのインスタンスを使用できないことです。

例:

public class Key
{
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}

これはコンパイルされますが、 サイクルごとに1つのキーが生成されます

var groupedCycles = cycles.GroupBy(x => new Key
{ 
  Prop1 = x.Column1, 
  Prop2 = x.Column2 
})

重要なプロパティに名前を付けることを忘れてしまった場合は、それらのプロパティを取得してください。 これはGroupBy正しく行い、主要なプロパティを提供します。

var groupedCycles = cycles.GroupBy(x => new 
{ 
  Prop1 = x.Column1, 
  Prop2= x.Column2 
})

foreach (var groupedCycle in groupedCycles)
{
    var key = new Key();
    key.Prop1 = groupedCycle.Key.Prop1;
    key.Prop2 = groupedCycle.Key.Prop2;
}



Related