Come posso fare SELECT UNIQUE con LINQ?


96

Ho una lista come questa:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

Sto provando a fare un SELECT UNIQUE con LINQ, cioè voglio

Red
Brown
Yellow
Green
Orange

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

Poi l'ho cambiato in

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

senza successo. Il primo selectottiene TUTTI i colori, quindi come lo modifico per ottenere solo i valori univoci?

Se c'è un modo migliore per strutturare questa query, più che felice di seguire quella strada.

Come posso modificarlo in modo da poter avere .OrderBy( "column name" )cioè in ordine alfabetico per nome del colore, quindi proprietà del nome?

Continuo a ricevere un messaggio:

Gli argomenti di tipo non possono essere dedotti dall'utilizzo. Prova a specificare esplicitamente gli argomenti del tipo.

Risposte:


159

La Distinct()sta per rovinare l'ordine, in modo da avere per la selezione dopo.

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

3
Grazie, questa è la risposta corretta. Qualcuno può spiegare cosa va nei parametri .OrderBy (). Hai nome => nome. Il nome proviene dal nome della colonna nel DB? Perché abbiamo dbo.Color.Namequindi solo name=>nameche mi suggerisce che non è il nome della colonna? Bizzarro, viene ordinato correttamente anche se lo cambio in.OrderBy(a=>a)
barone

3
Il nome della variabile è irrilevante. È solo {oggetto passato alla funzione} => {oggetto usato per ordinare}. Poiché abbiamo già eseguito la selezione, l'unica cosa nella raccolta da ordinare sono i nomi.
James Curran

Grazie @JamesCurran, la tua soluzione mi ha aiutato molto.
Ron

Sembra che sarebbe bello se ci fosse un OrderedBy () per l'ordinamento dell'intero oggetto / record. Un metodo di estensione continua a chiamare un delegato senza motivo.
NetMage

@NetMage - chiarisci cosa intendi con "l'intero oggetto / record". Ogni campo? In che ordine? Compresa la chiave primaria?
James Curran

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

10

Utilizzando la sintassi di comprensione delle query è possibile ottenere l'ordine come segue:

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

Hmm ... che non ha ottenuto un ordine alfabetico - per qualche motivo ... ho cambiato ascendente e discendente e ho ottenuto lo stesso risultato. L'affermazione distinta lo influenza? forse deve essere ordinato dopo?
barone

Potrei provare var uniqueColors = from result in (from dbo in database.MainTable dove dbo.Property select dbo.Color.Name) .Distinct () orderby result ascending;
cordialgerm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.