使用动态 linq 分组后的访问密钥

本文关键字:访问 密钥 动态 linq | 更新日期: 2023-09-27 18:24:10

Using System.Dynamic.Linq 我有一个 group by 语句,看起来像这样:

var rowGrouped = data.GroupBy(rGroup, string.Format("new({0})", c));

其中c只是我需要在分组中选择的字段名称的字符串数组。 在这种情况下,GroupBy返回一个IEnumerable(注意:不是IEnumerable<T>,因为我们不知道T是什么(。常规的 GroupBy 将返回一个System.Collections.Generic.IEnumerable<IGrouping<TKey, TElement>>

现在我的问题是,如何遍历组,以便我可以访问密钥(KeyIGrouping<TKey, TElement>中定义,但我不知道TKey和先TElement(?

我最初尝试了这个:

foreach (var row in rowGrouped)

哪个迭代,但我无法访问row.Key(在这种情况下row是类型 object (

所以我这样做了:

foreach (IGrouping<object,dynamic> row in rowGrouped)

令人惊讶的是,它奏效了...只要密钥是字符串。但是,如果键恰好是数字(例如short(,那么我会收到此错误:

Unable to cast object of type 'Grouping`2[System.Int16,DynamicClass2]' to type 
'System.Linq.IGrouping`2[System.Object,System.Object]'.

我需要能够循环访问rowGrouped并获取每个rowKey,然后循环访问每个组中的集合。

使用动态 linq 分组后的访问密钥

问题是您的密钥是short,并且您正在尝试转换为密钥object的接口。 虽然IGrouping<>具有协变类型参数,但它根本不起作用,因为方差仅适用于引用类型。 由于short是值类型,因此它不起作用。

如果你知道密钥将永远是一个short,你应该这样投射它。

foreach (IGrouping<short, dynamic> row in rowGrouped)
    ...

否则,如果它可以是值类型或引用类型,则可能更容易将整行保留为 dynamic

foreach (dynamic row in rowGrouped)
    ...

虽然我个人对此有过麻烦。也许是一个错误,但在这种情况下,运行时无法确定该行是否具有Key属性。我不能确切地告诉你为什么,但请记住这一点。