2012-05-10 42 views
13

Tôi có một bảng có 3 cột, ID, Mã ngắn, Ngày tải lên sau đây.Nhóm LINQ theo nhóm thứ tự của kết quả

Tôi muốn sử dụng LINQ để nhóm các kết quả bằng shortcode (và giữ tất cả các kết quả) rồi đặt hàng các nhóm đó và trả về một danh sách.

tôi có như sau:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList<PDFDocument>(). 
GroupBy(b=>b.ShortCode) 
.SelectMany(b=>b).ToList<PDFDocument>() 

Tôi muốn trả lại toàn bộ kết quả, nhóm lại theo shortcode, các mục trong mỗi nhóm được sắp xếp theo UploadDate và các nhóm được sắp xếp để một trong đó có các tài liệu gần đây nhất trong nó Đầu tiên.

Có ai biết điều này thậm chí có thể xảy ra không?

Trả lời

31

Hãy thử

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
    .AsEnumerable() 
    .OrderByDescending(d => d.UploadDate) 
    .GroupBy(d => d.ShortCode) 
    .SelectMany(g => g) 
    .ToList(); 

này nên

  • thứ tự các mục theo ngày tải lên (giảm dần nên mới nhất đầu tiên)
  • Sau đó, nhóm chúng bằng cách ngắn mã - vì vậy trong mỗi nhóm các mục vẫn được sắp xếp
  • Các nhóm vẫn ở trong desc kết thúc trật tự, vì vậy không cần thiết phải đặt hàng một lần nữa
  • Cuối cùng nối kết quả vào một danh sách duy nhất

Nếu hiệu suất là một vấn đề cho bạn nhiều được tốt hơn off làm

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
    .AsEnumerable() 
    .GroupBy(d => d.ShortCode) 
    .Select(g => g.OrderByDescending(d => d.UploadDate)) 
    .OrderByDescending(e => e.First().UploadDate) 
    .SelectMany(e => e) 
    .ToList(); 

mà sắp xếp các nội dung của từng nhóm riêng biệt thay vì sắp xếp mọi thứ trước và sau đó nhóm.

+0

Cảm ơn bạn, điều này không chính xác những gì tôi muốn. – Ketchup

+1

Tôi đã tự hỏi về thứ tự để đặt "OrderBy" + "GroupBy" + "OrderBy" và điều này trả lời nó hoàn hảo – EdmundYeung99

+0

Đây là trả lại cho tôi thực thể của danh sách loại, nhưng tôi muốn nó được nhóm loại, biên dịch lỗi i am nhận được là Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.List ' thành 'System.Collections.Generic.IEnumerable >'. Một chuyển đổi rõ ràng tồn tại (bạn đang bỏ lỡ một diễn viên?) –

5

Thực tế, bạn không muốn nhóm theo mã ngắn, bạn muốn đặt hàng theo chúng. Vì vậy, các truy vấn sau đây nên làm như lừa:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.OrderBy(b => b.ShortCode) 
.ThenBy(b => b.UploadDate) 
.ToList() 

Sửa Nếu bạn thực sự muốn sử dụng một groupby, bạn có thể làm như vậy theo cách này:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.GroupBy(b => b.ShortCode) 
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate)) 
.ToList() 

Nhưng tôi không khuyến khích nó. Không có điểm tạo nhóm nếu bạn không muốn các nhóm ở nơi đầu tiên!

Second chỉnh sửa

tôi đã không nhận bạn muốn các nhóm lệnh của UpdateTime quá. Nó làm phức tạp một chút truy vấn:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession) 
.ToList() 
.GroupBy(b => b.ShortCode) 
.Select(grouping => grouping.OrderByDescending(b => b.UploadDate)) 
.OrderByDescending(grouping => grouping.First().UploadDate) 
.SelectMany(grouping => grouping) 
.ToList() 
+0

Người có thể xuống hạng ít nhất là giải thích lý do tại sao anh ấy đã làm như vậy? – Falanwe

+0

Đơn đặt hàng này có phải cả hai thành phần bên trong nhóm theo ngày không? Và sau đó cũng đặt hàng các kết quả được nhóm? – Ketchup

+0

Tất cả các phần tử với ShortCode đầu tiên sẽ có trong danh sách kết quả đầu tiên, được sắp xếp theo UpdateTime, sau đó tất cả các phần tử có Mã ngắn thứ hai, được sắp xếp tương tự, v.v. Kết quả sẽ tương tự như kết quả bạn sẽ nhận được trong excel khi bạn đặt hàng các yếu tố của bạn chủ yếu bằng một cột, sau đó bởi một cột khác. – Falanwe

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