什么是只显示数据表中按列的正确方法

时间:2018-12-13 10:04:37

标签: c# linq

我的数据表中有以下数据

enter image description here

关于上述数据,我正在使用下面的LINQ查询过滤那些重复的记录

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

以上数据已成功过滤,但我面临的问题是Budget_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();

我的问题是如何使用上面的LINQ查询仅获得一个(Emplolyee_CRC)过滤的列,而无需编写下面的代码行

HasDuplicates.Columns.Remove("Budget_CRC");
HasDuplicates.AcceptChanges();

2 个答案:

答案 0 :(得分:1)

似乎您的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();

答案 1 :(得分:1)

如果您希望查询返回DataTable,则需要加载另一个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();

OR

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