2015-02-09 18 views
5

Nó rất dễ dàng để lựa chọn đầu tiên của mỗi nhóm:LINQ: Chọn tất cả từ mỗi nhóm trừ mục đầu tiên

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

Nhưng ...
Câu hỏi: làm thế nào tôi có thể chọn tất cả các từ mỗi nhóm ngoại trừ mục đầu tiên?

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

thông tin bổ sung:
mục tiêu thật sự của tôi là để xóa tất cả các bản sao ngoại trừ người cuối cùng (trong một cách lớn, ví dụ: không sử dụng một foreach trong bộ nhớ), vì vậy sau khi truy vấn trước đó tôi muốn sử dụng RemoveRange :

dbContext.Measurements.RemoveRange(everythingButFirstOfEachGroup); 

Vì vậy, nếu câu hỏi của tôi không có ý nghĩa, thông tin này có thể có ích.

Trả lời

6

Sử dụng Skip(1) để bỏ qua bản ghi đầu tiên và chọn phần còn lại.

Cái gì như:

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

Xem: Enumerable.Skip

Nếu bạn không cần một bộ sưu tập san phẳng sau đó thay thế SelectMany với Select trong đoạn mã.

+0

Sử dụng '.Skip (1)' sau 'GroupBy (...)' sẽ bỏ qua nhóm đầu tiên và đó không phải là điều tôi muốn. Oh, bạn chỉnh sửa câu trả lời của bạn, bây giờ nó có ý nghĩa – sports

+0

@sports, một cái gì đó như '.SelectMany (g => g.Skip (1));' sau khi mệnh đề where sẽ cung cấp cho bạn những gì bạn cần, tôi nghĩ. Bạn sẽ cần 'SelectMany' để làm phẳng bộ sưu tập của bạn. – Habib

+0

Điều này cũng cần thiết: '.SelectMany (g => g.OrderByDescending (r => r.SomeColumn) .Skip (1));' – sports

2

IGrouping<K, V> thực hiện IEnumerable<V>; bạn chỉ cần bỏ qua bên trong mệnh đề lựa chọn để áp dụng nó cho mỗi nhóm:

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

Bạn luôn có thể sử dụng .Distinct() để loại bỏ trùng lặp; có lẽ sắp xếp hoặc sắp xếp ngược lại và sau đó áp dụng .distinct() sẽ cung cấp cho bạn những gì bạn muốn.

Các vấn đề liên quan