可以轻松选择每组中的第一组:
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);
所以,如果我的问题毫无意义,这些信息可能会很方便.
解决方法
使用跳过(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));
如果您不需要展平的集合,请将SelectMany替换为Select in code snippet.