使用Entity Framework在SQL表中查找所有重复记录

13

我想创建一个数据网格,其中包含所有具有相同名称的记录。

我有这个表:

Shop
ID name          adress            city
-----------------------------------------
1  name1         adress 1          city1
2  name 2        adress2           city2
3  name 2        
4  name 2                          city2
5  name 3        
6  name 4        adress4           city4
7  name 4        adress4           city4

我的数据表必须包含:

2  name 2        adress2           city2
3  name 2        
4  name 2                          city2
6  name 4        adress4           city4
7  name 4        adress4           city4

但我不知道如何创建这个查询

3个回答

21

如果您使用Entity Framework,我假定您也使用LINQ。

在这种情况下,请尝试以下方式:

var duplicates = Shop.GroupBy(i => i.Name)
                     .Where(x => x.Count() > 1)
                     .Select(val => val.Key);

foreach(var item in duplicates)
{
    //process
}

在一个简单的示例中,输出看起来像这样:Linqpad example

//EDIT:

如果你想按多列分组,可以使用这个语法:

var query = (from sh in Shop
     group sh by new {sh.Name, sh.Address, sh.City} into grp
     select new
     {
        name = grp.Key.Name,
        address = grp.Key.Address,
        city = grp.Key.City
     }).ToList()
       .GroupBy(q => q.name)
       .Where (q => q.Count() >1)
       .Dump();
这将导致以下结果:

second result

//EDIT2:有时我很傻。 遵循KISS原则:

var query = Shop.GroupBy (s => s.Name).Where (s => s.Count () > 1).Dump();

如果我这样做,我只会得到一个重复记录的行。但是我想查看所有重复记录,以选择要删除的记录。 - Fabrice Mainguené
第一个查询仅按名称分组,并提供所有重复项,如我的“图片示例”所示。如果您能提供一些代码,也许我们可以找到错误。 - Marco
没有错误,只是不是我想要的。如果你看了我的例子,你会发现我想在结果中得到重复行的详细信息。在你的例子中,我会得到:{3,3,4,4,6,6,7,7...}。 - Fabrice Mainguené
抱歉,我显然误解了你。我已经扩展了我的答案以反映你的(希望正确的)需求。 - Marco
2
Dump() 扩展方法仅存在于 LinqPad 中。 - ilmatte
没关系。我花了很长时间才理解它...不知道为什么。很高兴能帮忙。 - Marco

2

尝试这种方式:

select name, adress, city
from tab
where name in ( select name
                from tab
                group by name
                having count(name) >1 )

1
var groupedByName = from shop in Shops
                    group shop by new shop.Name into grp
                    where grp.Count() > 1
                    select grp

应该完成这项工作。结果是一个Igrouping,其中一组值(商店)按名称分组,组的键是Shop的名称属性。
抱歉,但这段文字太长了,无法放在评论中。

这并不考虑重复项,你需要添加一个“where子句”。 - Marco

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