【问题标题】:How do I use SELECT GROUP BY in DataTable.Select(Expression)?如何在 DataTable.Select(Expression) 中使用 SELECT GROUP BY?
【发布时间】:2013-10-24 19:14:42
【问题描述】:

我尝试通过从每个组中选择第一行来删除重复的行。 例如

PK     Col1     Col2
1        A        B
2        A        B
3        C        C
4        C        C

我要退货:

PK     Col1     Col2
1        A        B
3        C        C

我尝试了以下代码,但没有成功:

DataTable dt = GetSampleDataTable(); //Get the table above.
dt = dt.Select("SELECT MIN(PK), Col1, Col2 GROUP BY Col1, Col2);

【问题讨论】:

  • 你不能。请改用 LINQ。
  • 不能按PK字段分组...
  • 我想使用什么,但我想返回一个 DataTable 对象。
  • 为什么不将分组或其他复杂处理委托给数据库级别的 sql,这样会更自然
  • 这能回答你的问题吗? Efficient DataTable Group By

标签: c# datatable duplicates


【解决方案1】:

DataTableSelect方法只支持{field} = {value}这样的简单过滤表达式。它不支持复杂的表达式,更不用说 SQL/Linq 语句了。

但是,您可以使用 Linq 扩展方法提取 DataRows 的集合,然后创建一个 DataTable

dt = dt.AsEnumerable()
       .GroupBy(r => new {Col1 = r["Col1"], Col2 = r["Col2"]})
       .Select(g => g.OrderBy(r => r["PK"]).First())
       .CopyToDataTable();

【讨论】:

  • 您需要使用什么程序集引用才能使其正常工作。我正在使用 System.data 但 GroupBy 命令说明我缺少程序集引用。
  • 这个 .CopyToDataTable() 是什么扩展名?
  • @user5013 GroupBy 在 System.Linq 命名空间中。如果您还没有System.Core,则需要参考。
【解决方案2】:
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable();

【讨论】:

  • 这个 .CopyToDataTable() 是什么扩展名?
【解决方案3】:
dt.AsEnumerable()
    .GroupBy(r => new { Col1 = r["Col1"], Col2 = r["Col2"] })
    .Select(g =>
    {
        var row = dt.NewRow();

        row["PK"] = g.Min(r => r.Field<int>("PK"));
        row["Col1"] = g.Key.Col1;
        row["Col2"] = g.Key.Col2;

        return row;

    })
    .CopyToDataTable();

【讨论】:

    【解决方案4】:

    此解决方案按 Col1 排序并按 Col2 分组。然后提取 Col2 的值并显示在 mbox 中。

    var grouped = from DataRow dr in dt.Rows orderby dr["Col1"] group dr by dr["Col2"];
    string x = "";
    foreach (var k in grouped) x += (string)(k.ElementAt(0)["Col2"]) + Environment.NewLine;
    MessageBox.Show(x);
    

    【讨论】:

      【解决方案5】:

      基于@Alfred Wallace 的解决方案:

              DataTable dt = new DataTable();
              dt.Columns.Add("Col1");
              dt.Columns.Add("Col2");
      
              dt.Rows.Add("120", "34");
              dt.Rows.Add("121", "34");
              dt.Rows.Add("122", "34");
      
              dt.Rows.Add("1", "345");
              dt.Rows.Add("2", "345");
              dt.Rows.Add("3", "345");
      
              var grouped = from DataRow dr in dt.Rows orderby dr["Col1"] group dr by dr["Col2"];
              string xxx = "", yyy = "";
              foreach (var k_group in grouped)
              {                
                  xxx += (string)(k_group.ElementAt(0)["Col1"]) + Environment.NewLine;
                  foreach (DataRow item_dr in k_group)
                  {                    
                      yyy += (string)(item_dr["Col1"]) + Environment.NewLine;
                      //  or use WhatEverMethod(item_dr);
                  }
                  var zzz = k_group.Max(g => g["Col1"]);
                  var qqq = k_group.Key;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-11
        • 2019-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2013-10-06
        • 2021-09-28
        相关资源
        最近更新 更多