Я пытаюсь использовать выражения 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 стал универсальным.
Expression<Func<Row,object>>
в одинExpression<Func<Row,object>>
, который возвращает кортеж или массив значений или что-то еще. Похоже, вы используете linq to sql, и я недостаточно знаю о переводе в sql, чтобы знать, можете ли вы сделать это переводимым способом. - person phoog   schedule 14.04.2012