代码之家  ›  专栏  ›  技术社区  ›  Ahmer Ali Ahsan

在datatable中只显示GROUPBY列的正确方式是什么

  •  0
  • Ahmer Ali Ahsan  · 技术社区  · 7 年前

    我的数据表中有以下数据

    enter image description here

    DataTable HasDuplicates = dt.AsEnumerable()
                                  .GroupBy(g => g["Empolyee_CRC"])
                                  .Where(c => c.Count() > 1)
                                  .Select(g => g.OrderBy(r => r["Empolyee_CRC"]).First())
                                  .CopyToDataTable();
    

    它返回我下面的数据

    enter image description here

    以上数据已成功过滤,但我面临的问题是预算CRC列未删除。因此,我在下面写下了我的疑问,并得到了我想要的结果。

    DataTable HasDuplicates = dt.AsEnumerable()
                              .GroupBy(g => g["Empolyee_CRC"])
                              .Where(c => c.Count() > 1)
                              .Select(g => g.OrderBy(r => r["Empolyee_CRC"]).First())
                              .CopyToDataTable();
    
    HasDuplicates.Columns.Remove("Budget_CRC");
    HasDuplicates.AcceptChanges();
    

    HasDuplicates.Columns.Remove("Budget_CRC");
    HasDuplicates.AcceptChanges();
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   er-sho    7 年前

    DataTable 如果希望查询返回 数据表

    DataTable dtResult = new DataTable();
    dtResult.Columns.Add("Empolyee_CRC");
    
    DataTable HasDuplicates = dt.AsEnumerable()
                                .GroupBy(g => g["Empolyee_CRC"])
                                .Where(c => c.Count() > 1)
                                .OrderBy(x => x.Key)
                                .Select(g => dtResult.LoadDataRow(new object[] { g.FirstOrDefault().Field<string>("Empolyee_CRC") }, false))
                                .CopyToDataTable();
    

    或

    DataTable HasDuplicates = dt.AsEnumerable()
                                .GroupBy(g => g["Empolyee_CRC"])
                                .Where(c => c.Count() > 1)
                                .OrderBy(x => x.Key)
                                .Select(g => dtResult.LoadDataRow(new object[] { g.Key }, false))
                                .CopyToDataTable();
    

    输出:

    enter image description here

    编辑:

    若您想避免创建新的数据表,那个么您可以简单地将所选数据投影到列表中。

    在里面 if 在下面,您可以使用以分隔的两个条件中的任何一个 &&

    if (dt.Rows.Count > 0 && dt.AsEnumerable().Select(x => x["Empolyee_CRC"]).Count() > 0)
    {
        var result = dt.AsEnumerable()
                       .GroupBy(g => g["Empolyee_CRC"])
                       .Where(c => c.Count() > 1)
                       .OrderBy(x => x.Key)
                       .Select(g => new { Empolyee_CRC = g.FirstOrDefault().Field<string>("Empolyee_CRC") })
                       .ToList();
    }
    

    enter image description here

        2
  •  1
  •   Szymon Tomczyk    7 年前

    看来你在LINQ中有错误的SELECT语句,考虑下面的例子:

    DataTable HasDuplicates = dt.AsEnumerable()
                              .GroupBy(g => g["Empolyee_CRC"])
                              .Where(c => c.Count() > 1)
                              .Select(g => g
                                    .OrderBy(r => r["Empolyee_CRC"])
                                    .Select(r => r["Empolyee_CRC"])
                                    .First())
                              .CopyToDataTable();