Làm cách nào để thực hiện CHỌN DUY NHẤT với LINQ?


96

Tôi có một danh sách như thế này:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Tôi đang cố gắng thực hiện CHỌN DUY NHẤT với LINQ, tức là tôi muốn

Red
Brown
Yellow
Green
Orange

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name;

Sau đó tôi đã thay đổi điều này thành

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name.Distinct();

không thành công. Đầu tiên selectcó TẤT CẢ các màu, vậy làm cách nào để sửa đổi nó để chỉ nhận các giá trị duy nhất?

Nếu có một cách tốt hơn để cấu trúc truy vấn này, bạn rất vui khi đi theo lộ trình đó.

Làm cách nào để chỉnh sửa nó để tôi có .OrderBy ("tên cột") tức là theo thứ tự bảng chữ cái theo tên màu, vì vậy thuộc tính tên?

Tôi tiếp tục nhận được một tin nhắn:

Các đối số kiểu không thể được suy ra từ cách sử dụng. Hãy thử cụ thể hóa các đối số kiểu một cách rõ ràng.

Câu trả lời:


159

Distinction () sẽ làm rối thứ tự, vì vậy bạn sẽ phải sắp xếp sau đó.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);

3
Cảm ơn, đây là câu trả lời chính xác. Ai đó có thể vui lòng giải thích những gì đi trong các tham số .OrderBy (). Bạn có tên => tên. Tên đó có phải đến từ tên cột trong DB không? Bởi vì dbo.Color.Namesau đó chúng tôi chỉ name=>namegợi ý cho tôi rằng nó không phải là tên cột? Bizarre nó cũng sẽ sắp xếp đúng cách nếu tôi chỉ cần thay đổi đó để.OrderBy(a=>a)
ông trùm

3
Tên của biến không liên quan. Nó chỉ là {đối tượng được truyền vào hàm} => {đối tượng dùng để sắp xếp}. Vì chúng tôi đã thực hiện Chọn, điều duy nhất trong bộ sưu tập được sắp xếp là tên.
James Curran

Cảm ơn @JamesCurran, giải pháp của bạn đã giúp tôi rất nhiều.
Ron

Có vẻ như sẽ rất tuyệt nếu có một OrderedBy () để sắp xếp theo toàn bộ đối tượng / bản ghi. Một phương thức mở rộng sẽ vẫn gọi một đại biểu mà không có lý do.
NetMage 21/12/16

@NetMage - làm rõ ý bạn là "toàn bộ đối tượng / bản ghi". Mọi lĩnh vực? Theo thứ tự? Bao gồm cả khóa chính?
James Curran

20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();

10

Sử dụng cú pháp hiểu truy vấn, bạn có thể đạt được thứ tự như sau:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();

Hmm ... điều đó không đạt được sắp xếp theo thứ tự bảng chữ cái - vì một số lý do ... Tôi đã chuyển đổi tăng dần và giảm dần và nhận được cùng một kết quả. Tuyên bố khác biệt có ảnh hưởng đến nó không? có lẽ nó cần phải được đặt hàng sau đó?
baron

Có thể thử var uniqueColors = from result in (from dbo in database.MainTable where dbo.Property select dbo.Color.Name) .Distinct () orderby result ascending;
cordialgerm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.