2010-08-19 8 views
89

Ich habe eine Liste wie folgt aus:Wie kann ich mit LINQ SELECT UNIQUE?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

ich eine SELECT UNIQUE mit LINQ zu tun versuche, also ich will

Red 
Brown 
Yellow 
Green 
Orange 

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

ich diese dann zu

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

mit Kein Erfolg. Die erste select erhält ALLE Farben, also wie ändere ich es, um nur die eindeutigen Werte zu erhalten?

Wenn es eine bessere Möglichkeit zum Strukturieren dieser Abfrage gibt, mehr als glücklich, diese Route zu gehen.

Wie gehe ich über die Bearbeitung, damit ich .OrderBy ("Spaltenname") haben kann, d.h. alphabetisch nach Farbnamen, also Name Eigenschaft?

Ich erhalte eine Nachricht:

Die Art Argumente können nicht von der Nutzung zu entnehmen. Versuchen Sie, die Typargumente explizit anzugeben.

Antwort

148

Die Distinct(), um Chaos wird die Bestellung, so dass Sie nach, dass die Sortierung haben werden .

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

Danke, das ist die richtige Antwort. Kann jemand bitte erklären, was in den .OrderBy() Parametern passiert. Sie haben name => name. Kommt dieser Name vom Spaltennamen in der DB? Weil wir 'dbo.Color.Name' dann nur' name => name' haben, was für mich bedeutet, dass es nicht der Spaltenname ist? Bizarr es sortiert auch richtig, wenn ich das nur zu '.OrderBy (a => a)' – baron

+3

ändern Der Name der Variablen ist irrelevant. Es ist nur {Objekt in Funktion übergeben} => {Objekt zum Sortieren}. Da wir die Auswahl bereits vorgenommen haben, werden nur die Namen in der Sammlung sortiert. –

+0

Danke @JamesCurran, deine Lösung hat mir sehr geholfen. – Ron

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

+1, aber ich schlage vor, Sie einen Codeblock für Ihren Code verwenden –

10

Abfrage-Syntax verwenden könnten Sie die orderby erreichen wie folgt:

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

Hmm ..., die nicht eine alphabetische Sortierung erreicht haben - aus irgendeinem Grund ... Ich wechselte aufsteigend und absteigend und bekam das gleiche Ergebnis. Beeinflusst die unterschiedliche Aussage das? Vielleicht muss es danach bestellt werden? – baron

+0

könnte versuchen var uniqueColors = von Ergebnis in (von dbo in database.MainTable wo dbo.Property dbo.Color.Name wählen) .Distinct() orderby Ergebnis aufsteigend; – cordialgerm