使用LINQ查找/删除重复项

7

我有一个包含许多重复项的表格。这些都是完全相同的副本,除了主键列,它是一个整数标识列。

使用EF和LINQ,我该如何查找并删除这些重复项,只留下一份副本。

我在SQL和SSMS中找到了这些重复项以及每个重复项的计数。我只是不知道从哪里开始使用LINQ。

谢谢!


1
你不直接使用T-SQL删除重复项的原因是什么? - Mike M.
@ Mike M - 我正在尝试更多地使用LINQ,但我也不确定如何在T-SQL中实现它 :-) - DenaliHardtail
2个回答

8

我能够提供一些初步想法(未经测试):

var q = from r in Context.Table
        group r by new { FieldA = r.FieldA, FieldB = r.FieldB, // ...
            into g
        where g.Count() > 1
        select g;
foreach (var g in q)
{
    var dupes = g.Skip(1).ToList();
    foreach (var record in dupes)
    {
        Context.DeleteObject(record);
    }
}
Context.SaveChanges();

为什么不在重复项中使用“Skip(1)”,然后对结果进行“foreach”循环并以这种方式删除它们,而不是使用while循环使其成为无限循环? - Enigmativity
这与我最初想到的解决方案类似。我只是在将所有LINQ部分组合在一起时遇到了困难。谢谢! - DenaliHardtail
1
干得好。我可以建议你再进一步,纯粹使用LINQ来扁平化结果,然后做一个“foreach”循环来删除。甚至可以使用“.ToArray()”,然后“Array.ForEach(dupes, Context.DeleteObject);”。只是一个建议。 :-) - Enigmativity

1

@Craig Stuntz的回答基础上,提供了一个“一行代码”的替代方案:

var duplicates = db.Table.GroupBy(a => new { a.FieldA, a.FieldB, ...})
                         .Where(a => a.Count() > 1)
                         .SelectMany(a => a.ToList());

foreach (var d in duplicates)
{
     db.DeleteObject(d);
}

db.SaveChanges();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接