删除分组集合的每个第一个元素

时间:2014-10-21 18:48:50

标签: c# asp.net-mvc linq

我有一组元素,其中一些元素是重复的。我需要提取所有记录,但只记录第一条记录,如果记录是重复集之一。

我能够对元素进行分组并查找所有具有重复项的元素,但是如何删除组中的每个第一个元素?

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。如果有人提供不同的方法,我会很高兴。

2 个答案:

答案 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);