【问题标题】:Access key after grouping by with dynamic linq使用动态 linq 分组后的访问密钥
【发布时间】:2014-09-25 00:38:08
【问题描述】:

使用 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> 中定义,但我不知道 TKeyTElement a先验)?

我最初尝试过这个:

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 并为每个row 获取Key,然后遍历每个组中的集合。

【问题讨论】:

  • 我认为你不能只称它为IGrouping&lt;dynamic, dynamic&gt;?
  • @Chris:我也试过了。没用。同样的问题。

标签: c# linq


【解决方案1】:

问题是您的密钥是short,而您正试图转换到密钥为object 的接口。虽然IGrouping&lt;&gt; 具有协变类型参数,但它根本不起作用,因为variance only applies to reference types。由于short是值类型,所以它不起作用。

如果您知道密钥将始终是 short,您应该这样转换它。

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

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

foreach (dynamic row in rowGrouped)
    ...

虽然我个人在这方面遇到了麻烦。在这种情况下,可能是一个错误,但运行时无法确定该行具有 Key 属性。我不能告诉你确切的原因,但请记住这一点。

【讨论】:

  • 问题是我不知道key永远是short。有时是,有时是字符串或其他东西。
  • foreach (dynamic row in rowGrouped) 的问题是我得到RuntimeBinderException 和消息'object' does not contain a definition for 'Key'),这很奇怪,因为当我在调试器中将鼠标悬停在row 上时,我可以看到Key
  • 我没有太多关于您将如何使用查询的上下文,但是您必须想出一种方法来使键始终成为引用类型。您可以在分组时执行data.GroupBy(string.Format("new({0} as Key)", rGroup), string.Format("new({0})", c)) 之类的操作,然后您只需记住实际密钥位于KeyKey 属性中。当然还有其他方法可以解决这个问题,但这可能是最容易实现的。
  • 实际上这几乎是我遇到的解决方案。我有一个相关的问题,它几乎从不同的角度解决了同一个问题,实际上有两个字段,一个是 year,一个是 qtr,我想将它们合并到一个列中。我认为选择它们为new (year,qtr) 实际上解决了这两个问题,我可以将该对象正确格式化为yearQqt 作为前端的问题。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多