2013-01-31 32 views
7

Tôi đang cố gắng sử dụng LINQ (đến EF) để nhận danh sách DISTINCT và sau đó sắp xếp nó. Tất cả các ví dụ tôi tìm thấy sắp xếp kết quả dựa trên giá trị DISTINCT. Nhưng tôi muốn sắp xếp nó trên một lĩnh vực khác.LINQ: Riêng biệt và trật tự

Ví dụ: Bảng với 2 trường (canvasSize và canvasLength);

var sizes = (from s in ent.competitors       
      select s.canvasSize).Distinct().OrderBy(x => x); 

Tất cả các ví dụ tôi tìm thấy cung cấp loại câu trả lời này. Nhưng nó sắp xếp theo canvasSize trong khi, tôi muốn sắp xếp theo canvasLength.

Tôi đang mắc kẹt ... Bất cứ lời khuyên được đánh giá rất cao ...

mỗi J. Skeet> Thông tin bổ sung:

company canvasSize canvasLength 

abc  8x10   8 
d   8x10   8 
e   10x10  10 
f   10x10  10 
g   40x40  40 

Tôi muốn nó được phân biệt trên canvasSize. Vấn đề là khi sắp xếp, nó kết quả theo thứ tự này:

10x10 
40x40 
8x10 

Tôi muốn cùng một kết quả thiết lập nhưng được sắp xếp sử dụng canvasLength nên kết quả là:

8x10 
10x10 
40x40 
+0

Vâng những gì bạn muốn nó được phân biệt bởi * *? Nó sẽ thực sự giúp đỡ nếu bạn có thể cung cấp cho một số dữ liệu mẫu và kết quả mong đợi. –

+0

Vì vậy, bạn có muốn cả canvasSize và canvasLength trong kết quả, được sắp xếp theo canvasLength không? –

+0

Bạn đang xử lý bao nhiêu dữ liệu? Đường đi của kháng cự ít nhất là thực hiện lệnh của bạn trên cột A ở cấp DB, chọn hai cột và đưa chúng vào bộ nhớ, sau đó chọn cột đơn B của bạn và sử dụng riêng biệt ở phía bộ nhớ. Thật đơn giản để viết. Tuy nhiên, nó có thể không mở rộng nếu bạn có nhiều dữ liệu. (Điều này giả định rằng cơ sở dữ liệu không đảm bảo việc bảo quản trật tự khi sử dụng Distinct. Nếu có, sau đó dính vào DB.) –

Trả lời

10

Tôi nghĩ rằng những gì bạn 'tái sau có thể một cái gì đó như thế này:

var sizes = (from s in ent.competitors       
      select new { s.canvasSize, s.canvasLength }) 
      .Distinct() 
      .OrderBy(x => x.canvasLength); 

cập nhật

Dựa trên những thông tin bổ sung trong câu hỏi của bạn, sau đây nên làm những gì bạn muốn:

var sizes = ent.competitors 
       .Select(c => new {c.canvasSize, c.canvasLength}) 
       .Distinct() 
       .OrderBy(x => x.canvasLength) 
       .Select(x => x.CanvasSize) 
+0

Đối với trường hợp đặc biệt này khi các trường phụ thuộc vào nhau, điều này sẽ hoạt động, vì nếu 'canvasSize' giống hệt nhau, vì vậy là 'canvasLength'. Nếu chúng khác nhau một cách độc lập, nó sẽ là một vấn đề. –

+0

@JoachimIsaksson - Đồng ý, nhưng sau đó bạn chỉ cần thêm một bộ chọn khóa vào cuộc gọi 'Distinct()'. –

+0

@AndrewCooper: đây gần như là câu trả lời, tôi chỉ muốn canvasSize trong kết quả nhưng tôi muốn kết quả cuối cùng được sắp xếp theo canvasLength – nanonerd

2
var sizes = ent.competitors 
       .GroupBy(s => s.canvasSize) 
       .Select(g => g.First()) 
       .OrderBy(s => s.canvasLength); 
Các vấn đề liên quan