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.

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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.