我正在尝试使用 Linq 表达式来构造查询,并且试图按多列进行分组。假设我有一个基本集合:
IEnumerable<Row> collection = new Row[]
{
new Row() { Col1 = "a", Col2="x" },
new Row() { Col1 = "a", Col2="x" },
new Row() { Col1 = "a", Col2="y" },
};
我知道您可以使用 lambda 表达式对它们进行分组:
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中的实体类型成为通用的。