Linq式を使用してクエリを作成しようとしていますが、複数の列でグループ化しようとしてスタックしています。基本的なコレクションがあるとしましょう。
IEnumerable<Row> collection = new Row[]
{
new Row() { Col1 = "a", Col2="x" },
new Row() { Col1 = "a", Col2="x" },
new Row() { Col1 = "a", Col2="y" },
};
ラムダ式を使用してこれらをグループ化できることを私は知っています:
foreach (var grp in collection.GroupBy(item => new { item.Col1, item.Col2 }))
{
Debug.Write("Grouping by " + grp.Key.Col1 + " and " + grp.Key.Col2 + ": ");
Debug.WriteLine(grp.Count() + " rows");
}
ご覧のとおり、これは正しくグループ化されます。
Grouping by a and x: 2 rows
Grouping by a and y: 1 rows
しかし、ここで、グループ化するセレクターのコレクションを受け取り、それがメソッドのパラメーターとして渡され、エンティティータイプがジェネリックであるとします。
void doLinq<T>(params Expression<Func<T,object>>[] selectors)
{
// linq stuff
}
メソッドを呼び出す人は誰でも次のように呼び出します。
doLinq<Row>(entity=>entity.Col1, entity=>entity.Col2);
group-by式を作成するにはどうすればよいですか?
foreach (var grp in collection.GroupBy(
item => new {
// selectors??
}))
{
// grp.Key. ??
}
編集
セレクターのセットが必要な理由を明確にするために、上記を更新しました。
編集#2
doLinqのエンティティタイプを汎用にしました。