【发布时间】:2012-04-13 18:26:56
【问题描述】:
我正在尝试使用 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 中的实体类型通用。
【问题讨论】:
-
似乎您应该能够编写一个函数,将几个
Expression<Func<Row,object>>组合成一个Expression<Func<Row,object>>,返回一个元组或一个值数组或其他任何东西。看起来您正在使用 linq to sql,但是我对 sql 的翻译了解不足,无法知道您是否可以以可翻译的方式执行此操作。 -
@phoog 看起来你应该能够将它们组合成一个表达式——我仍然不知道该怎么做。我最终为每一行组合了表达式的结果。
-
您应该将您的解决方案作为新答案发布,而不是编辑问题。
标签: c# .net linq lambda linq-expressions