首页 > 解决方案 > 带有字典键的动态 Linq

问题描述

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

但是,我不清楚:

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

解决方案


此答案适用于您是否想使用外部库。这将比使用库效率低一点。您似乎还可以尝试另一个名为 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();

推荐阅读