很容易选择每组的第一个:
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);
所以,如果我的问题没有任何意义,那么这些信息可能很方便。
答案 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()会给你你想要的东西。