Bagaimana saya bisa melakukan SELECT UNIQUE dengan LINQ?

96

Saya punya daftar seperti ini:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Saya mencoba melakukan SELECT UNIQUE dengan LINQ, yaitu yang saya inginkan

Red
Brown
Yellow
Green
Orange

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

Saya kemudian mengubahnya menjadi

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

tanpa hasil. Yang pertama selectmendapatkan SEMUA warna, jadi bagaimana cara memodifikasinya agar hanya mendapatkan nilai unik?

Jika ada cara yang lebih baik untuk menyusun kueri ini, lebih dari senang untuk pergi ke rute itu.

Bagaimana cara mengeditnya sehingga saya dapat memiliki .OrderBy( "column name" )yaitu menurut abjad berdasarkan nama warna, jadi nama properti?

Saya terus mendapatkan pesan:

Argumen tipe tidak dapat disimpulkan dari penggunaan. Coba tentukan argumen tipe secara eksplisit.

baron
sumber

Jawaban:

159

Ini Distinct()akan mengacaukan pemesanan, jadi Anda harus menyortir setelah itu.

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);
James Curran
sumber
3
Terima kasih, ini jawaban yang benar. Adakah yang bisa menjelaskan apa yang masuk dalam parameter .OrderBy (). Anda memiliki nama => nama. Apakah nama itu berasal dari nama kolom di DB? Karena kita memiliki dbo.Color.Namekemudian hanya name=>nameyang petunjuk kepada saya itu bukan nama kolom? Anehnya juga menyortir dengan benar jika saya mengubahnya menjadi.OrderBy(a=>a)
baron
3
Nama variabel tidak relevan. Ini hanya {objek diteruskan ke fungsi} => {objek digunakan untuk mengurutkan}. Karena kita telah melakukan Select, satu-satunya hal dalam koleksi yang diurutkan adalah namanya.
James Curran
Terima kasih @JamesCurran, solusi Anda sangat membantu saya.
Ron
Sepertinya akan lebih baik jika ada OrderedBy () untuk diurutkan berdasarkan seluruh objek / rekaman. Metode ekstensi masih akan memanggil delegasi tanpa alasan.
NetMage
@NetMage - klarifikasi apa yang Anda maksud sebagai "seluruh objek / catatan". Setiap bidang? Dalam urutan apa? Termasuk kunci utama?
James Curran
20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();
jwendl
sumber
10

Dengan menggunakan sintaks pemahaman kueri, Anda dapat mencapai orderby sebagai berikut:

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();
cordialgerm
sumber
Hmm ... itu tidak mencapai jenis abjad - untuk beberapa alasan ... Saya beralih naik dan turun dan mendapatkan hasil yang sama. Apakah pernyataan berbeda mempengaruhinya? mungkin perlu dipesan setelah itu?
baron
Bisa mencoba var uniqueColors = from result in (from dbo in database.MainTable where dbo.Property pilih dbo.Color.Name) .Distinct () orderby result ascending;
cordialgerm