【问题标题】:Select 1 column from a Group By LINQ query从 Group By LINQ 查询中选择 1 列
【发布时间】:2015-03-19 12:15:56
【问题描述】:

我认为我需要的内容相对简单,但我在 Google 上搜索的每个示例都只是使用 First() 返回结果,我已经在这样做了。这是我的表达:

var options = configData.AsEnumerable().GroupBy(row => row["myColumn"]).Select(grp => grp.First());

我只需要grp 部分中的一列,并且能够在其中添加.ToList() 后缀而不会出现错误。就目前而言,我收到 4 列,但只需要一个特定的列,就像 (grp => grp["myColumn"]) 没有导致错误错误 153 Cannot apply indexing with [] to an expression of type 'System.Linq.IGrouping<object,System.Data.DataRow>'

此外,Key 在分组部分中不起作用,因为这些结果来自 DataTable 对象。看这里->

【问题讨论】:

  • configData.AsEnumerable().GroupBy(row => row["myColumn"]).Select(grp => grp.Key).ToList(); 不适合你吗?
  • 分组后有多个组,每个组有一个键和组项。您的单列是组键吗?如果不是,由于您在每个组中有多个项目,您将选择组中的哪个项目的列?

标签: c# linq group-by


【解决方案1】:

如果你只想要钥匙,你可以使用

var options = configData.AsEnumerable().Select(row=>row["myColumn"]).Distinct();

【讨论】:

    【解决方案2】:

    认为这就是你想要的:

    configData.AsEnumerable()
        .GroupBy(r => r["myColumn"])
        .Select(g => new
        {
            myColumnValue = g.Key, 
            myColumnItems = g.Select(r => r["OtherColumn"]).ToList()
        });
    

    您了解这是如何/做什么的吗?试一试并检查生成的 IEnumerable。我不确定您是否完全了解 GroupBy 的工作原理,但请慢慢看上面的示例。

    看这部分:

    new
    {
        myColumnValue = g.Key, 
        myColumnItems = g.Select(r => r["OtherColumn"]).ToList()
    }
    

    这将创建一个匿名类型,它将“OtherColumn”列的值输出到按“myColumn”分组的列表中,其中“myColumn”的值位于 myColumnValue 属性中。

    我不确定这是否能回答您的问题,但看起来这就是您想要的。

    变量g 的类型是IGrouping<object, DataRow>,它不是DataRowIGrouping 接口旨在提供按 object 值分组的 DataRow's 列表 - 它不会产生平面列表,如果它产生了那么它只是一个排序,而不是 GroupBy。

    【讨论】:

    • 这可能是我需要的,但是如何处理列名中的Nulls?他们正在导致错误。
    • @Volearix 如果你的值中有一个null,你可以使用这个.GroupBy(r => r["myColumn"] ?? "SomeNullString")。如果你有DBNull,你可以做类似的事情。您可以在类似于 if 语句的 lambda 表达式中以任何方式操作 r["myColumn"]。如果这对您有用,我将编辑答案。
    【解决方案3】:

    只需在调用 First() 后指定您想要的字段,例如

    .Select(grp => grp.FirstOrDefault()["MyFieldName"]);
    

    这将从分组中取出第一条记录并从该记录中选择指定的字段。

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 2015-02-16
      • 2011-02-27
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多