27

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

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);
4

5 回答 5

57

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();
于 2013-10-16T15:47:25.153 回答
6
dt = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID")).Select(g => g.First()).CopyToDataTable();
于 2013-10-16T15:46:55.497 回答
4
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();
于 2018-04-04T14:44:27.517 回答
0

此解决方案按 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);
于 2014-05-08T09:05:22.090 回答
0

基于@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;
        }
于 2021-11-15T14:56:51.893 回答