具有字典键的动态Linq

时间:2018-06-25 18:13:43

标签: c# linq .net-4.0 dynamic-linq

我目前有一段代码,它使用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)));

但是,我不清楚:

  • 然后如何将此类传递给SelectGroupBy调用? System.Linq.Dynamic公开带有字符串的Select()重载-我是否只是传递类的属性名? System.Linq.Dynamic如何知道使用动态生成的类型?
  • 如何用值填充?我知道我可以使用Activator手动执行此操作,但是是否有将其映射到原始对象值的内置方法,还是需要自定义滚动?
  • 我什至在正确的轨道上吗?这些示例似乎没有使用DynamicExpression等,而只是使用了字符串。

1 个答案:

答案 0 :(得分:0)

如果您想使用外部库解决此问题,则可以使用此答案。这将比使用库效率低一些。似乎还可以尝试使用另一个名为Linq.Dynamic.Core的库。似乎更健壮。

我会将linq查询的结果转换为Dictionary类型的列表。使用此帖子的最高答案:LINQ query to return a Dictionary<string, string>

然后您可以进行如下操作:

List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();

list.OrderBy(x => x["columnName"]).ToList();