我有一组元素,其中一些元素是重复的。我需要提取所有记录,但只记录第一条记录,如果记录是重复集之一。
我能够对元素进行分组并查找所有具有重复项的元素,但是如何删除组中的每个第一个元素?
var records =
dbContext.Competitors
.GroupBy(x => x.Email)
.Select(x => new { Properties = x,
Count = x.Key.Count() })
.Where(x => x.Count > 1)
.ToList();
编辑:似乎用EF完成这项任务是不可能的,因为它无法将所需的linq表达式转换为SQL。如果有人提供不同的方法,我会很高兴。
答案 0 :(得分:3)
要从包含多个条目的每个电子邮件地址组中排除第一条记录,您可以执行以下操作:
var records = dbContext.Competitors
.GroupBy(x => x.Email)
.SelectMany(x => (x.Count() == 1) ? x : x.OrderBy(t=>t).Skip(1))
.ToList();
答案 1 :(得分:1)
这是逻辑:
按属性分组 > 选择每个组 >(可能)排序 > 跳过第一个
这可以变成一些像这样的 linq 代码:
//use SelectMany to flat the array
var x = list.GroupBy(g => g.Key).Select(grp => grp.Skip(1)).SelectMany(i => i);