【问题标题】:Delete Older Duplicate record from Datatable C#从数据表 C# 中删除旧的重复记录
【发布时间】:2020-06-22 16:01:08
【问题描述】:

我有一个数据表,其中包含如下所示的 3 列,其中包含重复记录。我想找到具有相同 Id 字段的重复 FileName 记录,并通过比较日期字段列删除较旧的记录。我怎样才能在Linq中做到这一点?
当前

文件名 ||创建日期 ||身份证

测试.pdf || 2020 年 6 月 22 日 || 1
测试1.pdf || 2020 年 6 月 22 日 || 2
测试.pdf || 2020 年 6 月 21 日 || 1
测试.pdf || 2020 年 6 月 21 日 || 3

删除此记录 - ID = 1 的 Test.pdf,因为它于 06/21 更新。

预期

文件名 ||创建日期 ||编号#

Test.pdf ||2020 年 6 月 22 日 || 1
Test1.pdf ||2020 年 6 月 22 日 || 2
测试.pdf ||2020 年 6 月 21 日 || 3

我可以通过按文件名对记录进行分组来使用下面的 sn-p 获取重复记录,但我不知道如何也按 Id 对记录进行分组

var filteredList = DT.AsEnumerable()
    .GroupBy(dr => dr.Field<string>("FileName"))
    .Select(g => g.OrderByDescending(dr => dr.Field<DateTime>("CreationDate")).First())
    .ToList();

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    您可以使用选择重复项的 sn-p 更改您正在执行的操作,以获取您要查找的项目的过滤列表。

    首先,按“文件名”列对 DataRows 进行分组。现在您已经有了这些组,请按 CreatedDate 列以降序对每个组进行排序,然后从每个组中取出第一个 DataRow。

      var filteredList = DT.AsEnumerable()
             .GroupBy(dr => dr.Field<string>("FileName"))
             .Select(g => g.OrderByDescending(dr => dr.Field<DateTime>("CreatedDate")).First())
             .ToList();
    

    【讨论】:

    • 非常感谢!它看起来正在工作。我会进一步测试它
    • 我认为如果你在GroupBy 之前调用OrderBy 而不是在Select 语句中调用它会很有效。
    • 感谢布莱克和萨吉德。它按预期工作,但是在测试时我意识到我需要按 FileName 和 Id 对记录进行分组,因为这就是使记录独一无二的原因。有关如何按 FileName 和 Id 对记录进行分组的任何指示?
    • 您可以使用GroupBy 将任意数量的属性分组到一个匿名对象中。将 GroupBy 行更改为:.GroupBy(dr =&gt; new { FileName = dr.Field&lt;string&gt;("FileName"), Id = dr.Field&lt;int&gt;("Id") } )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2016-01-07
    • 2013-02-23
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多