我的数据表中有以下数据
关于上述数据,我正在使用下面的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();
哪个在数据下面返回我
以上数据已成功过滤,但我面临的问题是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();
答案 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();
输出:
编辑:
如果要避免创建新的数据表,则只需将所选数据投影到类似列表中即可。
在下面的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();
}
输出: