如何识别 EF Core 3.1 中的重复项

How to identify duplicates in EF Core 3.1

问题如下:

我已经将项目更新到 EF Core 3.1 我在公司数据库中显示重复电子邮件地址的代码停止工作。 此代码在更新后不再有效:

cos = cos.Where(x => !string.IsNullOrEmpty(x.Email)).GroupBy(c => c.Email).Where(c => c.Count() > 1).SelectMany(grp => grp);

return View(await cos.ToListAsync());

我认为这是问题所在:

在 EF Core 3.0 之前,这是隐式完成的,因此 EF 下载所有结果行,然后应用 LINQ GroupBy。但是,这种隐式行为可能会让程序员期望整个 LINQ 查询在 SQL 中执行,当结果集相当大时可能会产生巨大的性能影响。因此,在 EF Core 3.0 中完全禁用了 GroupBy 的隐式客户端评估。

你知道怎么修改吗a.m。使用 EF Core 3.1 的代码? 感谢您的帮助。

可以替换group -> count -> ungroup查询操作

.GroupBy(c => c.Email).Where(c => c.Count() > 1).SelectMany(grp => grp)

目前无法翻译成 SQL(并且将来也没有很好的潜力 SQL 翻译),自子查询计算 "key" 匹配,例如

.Where(c => cos.Count(c1 => c1.Email == c.Email) > 1)

这适用于 ef core 3.1 并被正确翻译成 SQL。

var result = (from p in _db.People
group p by p.FullName into g
where g.Count() > 1
select g.Key)
.SelectMany(key => _db.People
.Where(t => t.FullName.ToUpper() == key.ToUpper()))