В настоящее время у меня есть фрагмент кода, который принимает DataView
, выбирает значения одного столбца, группирует по этим значениям, затем выводит счетчик (чтобы получить гистограмму, своего рода):
string columnName;
var dataSource = grid.DataSource as System.Data.DataView;
var values = dataSource.OfType<System.Data.DataRowView>()
.Select(r => r[columnName]);
_GroupedRowCounts = values.GroupBy(r => r[columnName])
.ToDictionary(v => v.Key, v => v.Count());
`` `
Это прекрасно работает, но оказывается, мне нужно сгруппировать по произвольному количеству столбцов, которые я не знаю во время компиляции.
Я предполагаю, что могу использоватьSystem.Linq.Dynamic для этого, но я обнаружил, что его документации довольно не хватает (начиная с: какой из проектов GitHub является текущим?).Очевидно, я могу использовать DynamicExpression.CreateClass()
для динамического создания класса со свойствами, основанными на столбцах, по которым я хочу сгруппировать, что-то вроде:
List<DataColumn> columns;
Type dynamicDataClass = DynamicExpression.CreateClass(columns.Select(c => new DynamicProperty(c.ColumnName, c.DataType)));
Однако мне неясно:
- как мне затем передать этот класс вызовам
Select
и GroupBy
?System.Linq.Dynamic предоставляет перегрузку Select (), которая принимает строку - я просто передаю имена свойств класса?Как System.Linq.Dynamic узнает, как использовать динамически генерируемый тип? - как мне заполнить это значениями?Я знаю, что могу использовать Активатор, чтобы сделать это вручную, но есть ли встроенный способ сопоставления этого со значениями исходных объектов, или мне нужно сделать это на заказ?
- Я даже направильный путь вообще?Кажется, что примеры не используют DynamicExpression и т. Д., А скорее просто строки.