LINQ:从第一个项目以外的每个组中选择全部

时间:2015-02-09 19:58:08

标签: c# linq linq-to-entities

很容易选择每组的第一个:

        var firstOfEachGroup = dbContext.Measurements
            .OrderByDescending(m => m.MeasurementId)
            .GroupBy(m => new { m.SomeColumn })
            .Where(g => g.Count() > 1)
            .Select(g => g.First());

但是...
问题:如何从第一项以外的每个组中选择所有项?

        var everythingButFirstOfEachGroup = dbContext.Measurements
            .OrderByDescending(m => m.MeasurementId)
            .GroupBy(m => new { m.SomeColumn })
            .Where(g => g.Count() > 1)
            .Select( ...? );

其他信息:
我的真正目标是删除除最后一个之外的所有重复项(以批量方式,即:不使用内存中的foreach),因此在上一个查询之后我想使用RemoveRange

 dbContext.Measurements.RemoveRange(everythingButFirstOfEachGroup);

所以,如果我的问题没有任何意义,那么这些信息可能很方便。

3 个答案:

答案 0 :(得分:7)

使用Skip(1)跳过第一条记录并选择其余记录。

类似的东西:

var firstOfEachGroup = dbContext.Measurements
                    .OrderByDescending(m => m.MeasurementId)
                    .GroupBy(m => new { m.SomeColumn })
                    .Where(g => g.Count() > 1)
                    .SelectMany(g => g.OrderByDescending(r => r.SomeColumn).Skip(1));

请参阅:Enumerable.Skip

如果您不需要展平的集合,请在代码段中将SelectMany替换为Select

答案 1 :(得分:2)

IGrouping<K, V>实施IEnumerable<V>;您只需要跳过select子句,将其应用于每个组:

.Select(g => g.Skip(1))

答案 2 :(得分:0)

您始终可以使用.Distinct()删除重复项;大概是排序或反向排序然后应用.distinct()会给你你想要的东西。